Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNZW1vcnkgSW5wdXQvT3V0cHV0IGZ1bmN0aW9ucwovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gUnlhbiBSdWJsZXkgPHJ5YW5AbG9zdHJlYWxpdHkub3JnPiAKLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMwovLwovLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECi8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAovLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCi8vIFRISVMgRElTQ0xBSU1FUi4KLy8KLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKI2luY2x1ZGUgIlV0aWxpdGllcy5oIgojaW5jbHVkZSAiRnJlZUltYWdlSU8uaCIKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBPcGVuIGFuZCBjbG9zZSBhIG1lbW9yeSBoYW5kbGUKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpGSU1FTU9SWSAqIERMTF9DQUxMQ09OViAKRnJlZUltYWdlX09wZW5NZW1vcnkoQllURSAqZGF0YSwgRFdPUkQgc2l6ZV9pbl9ieXRlcykgewoJLy8gYWxsb2NhdGUgYSBtZW1vcnkgaGFuZGxlCglGSU1FTU9SWSAqc3RyZWFtID0gKEZJTUVNT1JZKiltYWxsb2Moc2l6ZW9mKEZJTUVNT1JZKSk7CglpZihzdHJlYW0pIHsKCQlzdHJlYW0tPmRhdGEgPSAoQllURSopbWFsbG9jKHNpemVvZihGSU1FTU9SWUhFQURFUikpOwoKCQlpZihzdHJlYW0tPmRhdGEpIHsKCQkJRklNRU1PUllIRUFERVIgKm1lbV9oZWFkZXIgPSAoRklNRU1PUllIRUFERVIqKShzdHJlYW0tPmRhdGEpOwoKCQkJLy8gaW5pdGlhbGl6ZSB0aGUgbWVtb3J5IGhlYWRlcgoJCQltZW1zZXQobWVtX2hlYWRlciwgMCwgc2l6ZW9mKEZJTUVNT1JZSEVBREVSKSk7CgkJCQoJCQlpZihkYXRhICYmIHNpemVfaW5fYnl0ZXMpIHsKCQkJCS8vIHdyYXAgYSB1c2VyIGJ1ZmZlcgoJCQkJbWVtX2hlYWRlci0+ZGVsZXRlX21lID0gRkFMU0U7CgkJCQltZW1faGVhZGVyLT5kYXRhID0gKEJZVEUqKWRhdGE7CgkJCQltZW1faGVhZGVyLT5kYXRhX2xlbmd0aCA9IG1lbV9oZWFkZXItPmZpbGVfbGVuZ3RoID0gc2l6ZV9pbl9ieXRlczsKCQkJfSBlbHNlIHsKCQkJCW1lbV9oZWFkZXItPmRlbGV0ZV9tZSA9IFRSVUU7CgkJCX0KCgkJCXJldHVybiBzdHJlYW07CgkJfQoJCWZyZWUoc3RyZWFtKTsKCX0KCglyZXR1cm4gTlVMTDsKfQoKCnZvaWQgRExMX0NBTExDT05WCkZyZWVJbWFnZV9DbG9zZU1lbW9yeShGSU1FTU9SWSAqc3RyZWFtKSB7CglpZihzdHJlYW0gJiYgc3RyZWFtLT5kYXRhKSB7CgkJRklNRU1PUllIRUFERVIgKm1lbV9oZWFkZXIgPSAoRklNRU1PUllIRUFERVIqKShzdHJlYW0tPmRhdGEpOwoJCWlmKG1lbV9oZWFkZXItPmRlbGV0ZV9tZSkgewoJCQlmcmVlKG1lbV9oZWFkZXItPmRhdGEpOwoJCX0KCQlmcmVlKG1lbV9oZWFkZXIpOwoJCWZyZWUoc3RyZWFtKTsKCX0KfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIE1lbW9yeSBzdHJlYW0gbG9hZC9zYXZlIGZ1bmN0aW9ucwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkZJQklUTUFQICogRExMX0NBTExDT05WCkZyZWVJbWFnZV9Mb2FkRnJvbU1lbW9yeShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZJTUVNT1JZICpzdHJlYW0sIGludCBmbGFncykgewoJaWYgKHN0cmVhbSAmJiBzdHJlYW0tPmRhdGEpIHsKCQlGcmVlSW1hZ2VJTyBpbzsKCQlTZXRNZW1vcnlJTygmaW8pOwoKCQlyZXR1cm4gRnJlZUltYWdlX0xvYWRGcm9tSGFuZGxlKGZpZiwgJmlvLCAoZmlfaGFuZGxlKXN0cmVhbSwgZmxhZ3MpOwoJfQoKCXJldHVybiBOVUxMOwp9CgoKQk9PTCBETExfQ0FMTENPTlYKRnJlZUltYWdlX1NhdmVUb01lbW9yeShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZJQklUTUFQICpkaWIsIEZJTUVNT1JZICpzdHJlYW0sIGludCBmbGFncykgewoJaWYgKHN0cmVhbSkgewoJCUZyZWVJbWFnZUlPIGlvOwoJCVNldE1lbW9yeUlPKCZpbyk7CgoJCUZJTUVNT1JZSEVBREVSICptZW1faGVhZGVyID0gKEZJTUVNT1JZSEVBREVSKikoc3RyZWFtLT5kYXRhKTsKCgkJaWYobWVtX2hlYWRlci0+ZGVsZXRlX21lID09IFRSVUUpIHsKCQkJcmV0dXJuIEZyZWVJbWFnZV9TYXZlVG9IYW5kbGUoZmlmLCBkaWIsICZpbywgKGZpX2hhbmRsZSlzdHJlYW0sIGZsYWdzKTsKCQl9IGVsc2UgewoJCQkvLyBkbyBub3Qgc2F2ZSBpbiBhIHVzZXIgYnVmZmVyCgkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhmaWYsICJNZW1vcnkgYnVmZmVyIGlzIHJlYWQgb25seSIpOwoJCX0KCX0KCglyZXR1cm4gRkFMU0U7Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNZW1vcnkgc3RyZWFtIGJ1ZmZlciBhY2Nlc3MKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpCT09MIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfQWNxdWlyZU1lbW9yeShGSU1FTU9SWSAqc3RyZWFtLCBCWVRFICoqZGF0YSwgRFdPUkQgKnNpemVfaW5fYnl0ZXMpIHsKCWlmIChzdHJlYW0pIHsKCQlGSU1FTU9SWUhFQURFUiAqbWVtX2hlYWRlciA9IChGSU1FTU9SWUhFQURFUiopKHN0cmVhbS0+ZGF0YSk7CgoJCSpkYXRhID0gKEJZVEUqKW1lbV9oZWFkZXItPmRhdGE7CgkJKnNpemVfaW5fYnl0ZXMgPSBtZW1faGVhZGVyLT5maWxlX2xlbmd0aDsKCQlyZXR1cm4gVFJVRTsKCX0KCglyZXR1cm4gRkFMU0U7Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNZW1vcnkgc3RyZWFtIGZpbGUgdHlwZSBhY2Nlc3MKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpGUkVFX0lNQUdFX0ZPUk1BVCBETExfQ0FMTENPTlYKRnJlZUltYWdlX0dldEZpbGVUeXBlRnJvbU1lbW9yeShGSU1FTU9SWSAqc3RyZWFtLCBpbnQgc2l6ZSkgewoJRnJlZUltYWdlSU8gaW87CglTZXRNZW1vcnlJTygmaW8pOwoKCWlmIChzdHJlYW0gIT0gTlVMTCkgewoJCXJldHVybiBGcmVlSW1hZ2VfR2V0RmlsZVR5cGVGcm9tSGFuZGxlKCZpbywgKGZpX2hhbmRsZSlzdHJlYW0sIHNpemUpOwoJfQoKCXJldHVybiBGSUZfVU5LTk9XTjsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFNlZWtpbmcgaW4gTWVtb3J5IHN0cmVhbQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8qKgpNb3ZlcyB0aGUgbWVtb3J5IHBvaW50ZXIgdG8gYSBzcGVjaWZpZWQgbG9jYXRpb24KQHBhcmFtIHN0cmVhbSBQb2ludGVyIHRvIEZJTUVNT1JZIHN0cnVjdHVyZQpAcGFyYW0gb2Zmc2V0IE51bWJlciBvZiBieXRlcyBmcm9tIG9yaWdpbgpAcGFyYW0gb3JpZ2luIEluaXRpYWwgcG9zaXRpb24KQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKKi8KQk9PTCBETExfQ0FMTENPTlYKRnJlZUltYWdlX1NlZWtNZW1vcnkoRklNRU1PUlkgKnN0cmVhbSwgbG9uZyBvZmZzZXQsIGludCBvcmlnaW4pIHsKCUZyZWVJbWFnZUlPIGlvOwoJU2V0TWVtb3J5SU8oJmlvKTsKCglpZiAoc3RyZWFtICE9IE5VTEwpIHsKCQlpbnQgc3VjY2VzcyA9IGlvLnNlZWtfcHJvYygoZmlfaGFuZGxlKXN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pOwoJCXJldHVybiAoc3VjY2VzcyA9PSAwKSA/IFRSVUUgOiBGQUxTRTsKCX0KCglyZXR1cm4gRkFMU0U7Cn0KCi8qKgpHZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIGEgbWVtb3J5IHBvaW50ZXIKQHBhcmFtIHN0cmVhbSBUYXJnZXQgRklNRU1PUlkgc3RydWN0dXJlCkByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGlmIHN1Y2Nlc3NmdWwsIC0xIG90aGVyd2lzZQoqLwpsb25nIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfVGVsbE1lbW9yeShGSU1FTU9SWSAqc3RyZWFtKSB7CglGcmVlSW1hZ2VJTyBpbzsKCVNldE1lbW9yeUlPKCZpbyk7CgoJaWYgKHN0cmVhbSAhPSBOVUxMKSB7CgkJcmV0dXJuIGlvLnRlbGxfcHJvYygoZmlfaGFuZGxlKXN0cmVhbSk7Cgl9CgoJcmV0dXJuIC0xTDsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFJlYWRpbmcgb3IgV3JpdGluZyBpbiBNZW1vcnkgc3RyZWFtCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLyoqClJlYWRzIGRhdGEgZnJvbSBhIG1lbW9yeSBzdHJlYW0KQHBhcmFtIGJ1ZmZlciBTdG9yYWdlIGxvY2F0aW9uIGZvciBkYXRhCkBwYXJhbSBzaXplIEl0ZW0gc2l6ZSBpbiBieXRlcwpAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgcmVhZApAcGFyYW0gc3RyZWFtIFBvaW50ZXIgdG8gRklNRU1PUlkgc3RydWN0dXJlCkByZXR1cm4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZ1bGwgaXRlbXMgYWN0dWFsbHkgcmVhZCwgd2hpY2ggbWF5IGJlIGxlc3MgdGhhbiBjb3VudCBpZiBhbiBlcnJvciBvY2N1cnMKKi8KdW5zaWduZWQgRExMX0NBTExDT05WIApGcmVlSW1hZ2VfUmVhZE1lbW9yeSh2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGNvdW50LCBGSU1FTU9SWSAqc3RyZWFtKSB7CglGcmVlSW1hZ2VJTyBpbzsKCVNldE1lbW9yeUlPKCZpbyk7CgoJaWYgKHN0cmVhbSAhPSBOVUxMKSB7CgkJcmV0dXJuIGlvLnJlYWRfcHJvYyhidWZmZXIsIHNpemUsIGNvdW50LCBzdHJlYW0pOwoJfQoKCXJldHVybiAwOwp9CgovKioKV3JpdGVzIGRhdGEgdG8gYSBtZW1vcnkgc3RyZWFtLgpAcGFyYW0gYnVmZmVyIFBvaW50ZXIgdG8gZGF0YSB0byBiZSB3cml0dGVuCkBwYXJhbSBzaXplIEl0ZW0gc2l6ZSBpbiBieXRlcwpAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgd3JpdHRlbgpAcGFyYW0gc3RyZWFtIFBvaW50ZXIgdG8gRklNRU1PUlkgc3RydWN0dXJlCkByZXR1cm4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZ1bGwgaXRlbXMgYWN0dWFsbHkgd3JpdHRlbiwgd2hpY2ggbWF5IGJlIGxlc3MgdGhhbiBjb3VudCBpZiBhbiBlcnJvciBvY2N1cnMKKi8KdW5zaWduZWQgRExMX0NBTExDT05WIApGcmVlSW1hZ2VfV3JpdGVNZW1vcnkoY29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBjb3VudCwgRklNRU1PUlkgKnN0cmVhbSkgewoJaWYgKHN0cmVhbSAhPSBOVUxMKSB7CgkJRnJlZUltYWdlSU8gaW87CgkJU2V0TWVtb3J5SU8oJmlvKTsKCgkJRklNRU1PUllIRUFERVIgKm1lbV9oZWFkZXIgPSAoRklNRU1PUllIRUFERVIqKSgoKEZJTUVNT1JZKilzdHJlYW0pLT5kYXRhKTsKCgkJaWYobWVtX2hlYWRlci0+ZGVsZXRlX21lID09IFRSVUUpIHsKCQkJcmV0dXJuIGlvLndyaXRlX3Byb2MoKHZvaWQgKilidWZmZXIsIHNpemUsIGNvdW50LCBzdHJlYW0pOwoJCX0gZWxzZSB7CgkJCS8vIGRvIG5vdCB3cml0ZSBpbiBhIHVzZXIgYnVmZmVyCgkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfVU5LTk9XTiwgIk1lbW9yeSBidWZmZXIgaXMgcmVhZCBvbmx5Iik7CgkJfQoJfQoKCXJldHVybiAwOwp9Cgo=