Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBCTVAgTG9hZGVyIGFuZCBXcml0ZXIKLy8KLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQovLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKLy8gLSBNYXJrdXMgTG9pYmwgKG1hcmt1cy5sb2libEBlcG9zdC5kZSkKLy8gLSBNYXJ0aW4gV2ViZXIgKG1hcnR3ZWJAZ214Lm5ldCkKLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQovLyAtIE1pY2hhbCBOb3ZvdG55IChtaWNoYWxAZXRjLmN6KQovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMwovLwovLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECi8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAovLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCi8vIFRISVMgRElTQ0xBSU1FUi4KLy8KLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKI2luY2x1ZGUgIlV0aWxpdGllcy5oIgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgIENvbnN0YW50cyArIGhlYWRlcnMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIGNvbnN0IEJZVEUgUkxFX0NPTU1BTkQgICAgID0gMDsKc3RhdGljIGNvbnN0IEJZVEUgUkxFX0VORE9GTElORSAgID0gMDsKc3RhdGljIGNvbnN0IEJZVEUgUkxFX0VORE9GQklUTUFQID0gMTsKc3RhdGljIGNvbnN0IEJZVEUgUkxFX0RFTFRBICAgICAgID0gMjsKCnN0YXRpYyBjb25zdCBCWVRFIEJJX1JHQiAgICAgICAgICAgID0gMDsJLy8gY29tcHJlc3Npb246IG5vbmUKc3RhdGljIGNvbnN0IEJZVEUgQklfUkxFOCAgICAgICAgICAgPSAxOwkvLyBjb21wcmVzc2lvbjogUkxFIDgtYml0L3BpeGVsCnN0YXRpYyBjb25zdCBCWVRFIEJJX1JMRTQgICAgICAgICAgID0gMjsJLy8gY29tcHJlc3Npb246IFJMRSA0LWJpdC9waXhlbApzdGF0aWMgY29uc3QgQllURSBCSV9CSVRGSUVMRFMgICAgICA9IDM7CS8vIGNvbXByZXNzaW9uOiBCaXQgZmllbGQgb3IgSHVmZm1hbiAxRCBjb21wcmVzc2lvbiBmb3IgQklUTUFQQ09SRUhFQURFUjIKc3RhdGljIGNvbnN0IEJZVEUgQklfSlBFRyAgICAgICAgICAgPSA0OwkvLyBjb21wcmVzc2lvbjogSlBFRyBvciBSTEUtMjQgY29tcHJlc3Npb24gZm9yIEJJVE1BUENPUkVIRUFERVIyCnN0YXRpYyBjb25zdCBCWVRFIEJJX1BORyAgICAgICAgICAgID0gNTsJLy8gY29tcHJlc3Npb246IFBORwpzdGF0aWMgY29uc3QgQllURSBCSV9BTFBIQUJJVEZJRUxEUyA9IDY7CS8vIGNvbXByZXNzaW9uOiBCaXQgZmllbGQgKHRoaXMgdmFsdWUgaXMgdmFsaWQgaW4gV2luZG93cyBDRSAuTkVUIDQuMCBhbmQgbGF0ZXIpCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojaWZkZWYgX1dJTjMyCiNwcmFnbWEgcGFjayhwdXNoLCAxKQojZWxzZQojcHJhZ21hIHBhY2soMSkKI2VuZGlmCgp0eXBlZGVmIHN0cnVjdCB0YWdCSVRNQVBDT1JFSEVBREVSIHsKICBEV09SRCAgIGJjU2l6ZTsKICBXT1JEICAgIGJjV2lkdGg7CiAgV09SRCAgICBiY0hlaWdodDsKICBXT1JEICAgIGJjUGxhbmVzOwogIFdPUkQgICAgYmNCaXRDbnQ7Cn0gQklUTUFQQ09SRUhFQURFUiwgKlBCSVRNQVBDT1JFSEVBREVSOyAKCnR5cGVkZWYgc3RydWN0IHRhZ0JJVE1BUElORk9PUzJfMVhfSEVBREVSIHsKICBEV09SRCAgYmlTaXplOwogIFdPUkQgICBiaVdpZHRoOwogIFdPUkQgICBiaUhlaWdodDsgCiAgV09SRCAgIGJpUGxhbmVzOyAKICBXT1JEICAgYmlCaXRDb3VudDsKfSBCSVRNQVBJTkZPT1MyXzFYX0hFQURFUiwgKlBCSVRNQVBJTkZPT1MyXzFYX0hFQURFUjsgCgp0eXBlZGVmIHN0cnVjdCB0YWdCSVRNQVBGSUxFSEVBREVSIHsKICBXT1JEICAgIGJmVHlwZTsJCS8vISBUaGUgZmlsZSB0eXBlCiAgRFdPUkQgICBiZlNpemU7CQkvLyEgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgYml0bWFwIGZpbGUKICBXT1JEICAgIGJmUmVzZXJ2ZWQxOwkvLyEgUmVzZXJ2ZWQ7IG11c3QgYmUgemVybwogIFdPUkQgICAgYmZSZXNlcnZlZDI7CS8vISBSZXNlcnZlZDsgbXVzdCBiZSB6ZXJvCiAgRFdPUkQgICBiZk9mZkJpdHM7CS8vISBUaGUgb2Zmc2V0LCBpbiBieXRlcywgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBCSVRNQVBGSUxFSEVBREVSIHN0cnVjdHVyZSB0byB0aGUgYml0bWFwIGJpdHMKfSBCSVRNQVBGSUxFSEVBREVSLCAqUEJJVE1BUEZJTEVIRUFERVI7CgojaWZkZWYgX1dJTjMyCiNwcmFnbWEgcGFjayhwb3ApCiNlbHNlCiNwcmFnbWEgcGFjaygpCiNlbmRpZgoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQbHVnaW4gSW50ZXJmYWNlCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIEludGVybmFsIGZ1bmN0aW9ucwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgpzdGF0aWMgdm9pZApTd2FwSW5mb0hlYWRlcihCSVRNQVBJTkZPSEVBREVSICpoZWFkZXIpIHsKCVN3YXBMb25nKCZoZWFkZXItPmJpU2l6ZSk7CglTd2FwTG9uZygoRFdPUkQgKikmaGVhZGVyLT5iaVdpZHRoKTsKCVN3YXBMb25nKChEV09SRCAqKSZoZWFkZXItPmJpSGVpZ2h0KTsKCVN3YXBTaG9ydCgmaGVhZGVyLT5iaVBsYW5lcyk7CglTd2FwU2hvcnQoJmhlYWRlci0+YmlCaXRDb3VudCk7CglTd2FwTG9uZygmaGVhZGVyLT5iaUNvbXByZXNzaW9uKTsKCVN3YXBMb25nKCZoZWFkZXItPmJpU2l6ZUltYWdlKTsKCVN3YXBMb25nKChEV09SRCAqKSZoZWFkZXItPmJpWFBlbHNQZXJNZXRlcik7CglTd2FwTG9uZygoRFdPUkQgKikmaGVhZGVyLT5iaVlQZWxzUGVyTWV0ZXIpOwoJU3dhcExvbmcoJmhlYWRlci0+YmlDbHJVc2VkKTsKCVN3YXBMb25nKCZoZWFkZXItPmJpQ2xySW1wb3J0YW50KTsKfQoKc3RhdGljIHZvaWQKU3dhcENvcmVIZWFkZXIoQklUTUFQQ09SRUhFQURFUiAqaGVhZGVyKSB7CglTd2FwTG9uZygmaGVhZGVyLT5iY1NpemUpOwoJU3dhcFNob3J0KCZoZWFkZXItPmJjV2lkdGgpOwoJU3dhcFNob3J0KCZoZWFkZXItPmJjSGVpZ2h0KTsKCVN3YXBTaG9ydCgmaGVhZGVyLT5iY1BsYW5lcyk7CglTd2FwU2hvcnQoJmhlYWRlci0+YmNCaXRDbnQpOwp9CgpzdGF0aWMgdm9pZApTd2FwT1MyMVhIZWFkZXIoQklUTUFQSU5GT09TMl8xWF9IRUFERVIgKmhlYWRlcikgewoJU3dhcExvbmcoJmhlYWRlci0+YmlTaXplKTsKCVN3YXBTaG9ydCgmaGVhZGVyLT5iaVdpZHRoKTsKCVN3YXBTaG9ydCgmaGVhZGVyLT5iaUhlaWdodCk7CglTd2FwU2hvcnQoJmhlYWRlci0+YmlQbGFuZXMpOwoJU3dhcFNob3J0KCZoZWFkZXItPmJpQml0Q291bnQpOwp9CgpzdGF0aWMgdm9pZApTd2FwRmlsZUhlYWRlcihCSVRNQVBGSUxFSEVBREVSICpoZWFkZXIpIHsKCVN3YXBTaG9ydCgmaGVhZGVyLT5iZlR5cGUpOwogIAlTd2FwTG9uZygmaGVhZGVyLT5iZlNpemUpOwogIAlTd2FwU2hvcnQoJmhlYWRlci0+YmZSZXNlcnZlZDEpOwogIAlTd2FwU2hvcnQoJmhlYWRlci0+YmZSZXNlcnZlZDIpOwoJU3dhcExvbmcoJmhlYWRlci0+YmZPZmZCaXRzKTsKfQojZW5kaWYKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKioKTG9hZCB1bmNvbXByZXNzZWQgaW1hZ2UgcGl4ZWxzIGZvciAxLSwgNC0sIDgtLCAxNi0sIDI0LSBhbmQgMzItYml0IGRpYgpAcGFyYW0gaW8gRnJlZUltYWdlIElPCkBwYXJhbSBoYW5kbGUgRnJlZUltYWdlIElPIGhhbmRsZQpAcGFyYW0gZGliIEltYWdlIHRvIGJlIGxvYWRlZCAKQHBhcmFtIGhlaWdodCBJbWFnZSBoZWlnaHQKQHBhcmFtIHBpdGNoIEltYWdlIHBpdGNoCkBwYXJhbSBiaXRfY291bnQgSW1hZ2UgYml0LWRlcHRoICgxLSwgNC0sIDgtLCAxNi0sIDI0LSBvciAzMi1iaXQpCkByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCiovCnN0YXRpYyBCT09MIApMb2FkUGl4ZWxEYXRhKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgRklCSVRNQVAgKmRpYiwgaW50IGhlaWdodCwgdW5zaWduZWQgcGl0Y2gsIHVuc2lnbmVkIGJpdF9jb3VudCkgewoJdW5zaWduZWQgY291bnQgPSAwOwoKCS8vIExvYWQgcGl4ZWwgZGF0YQoJLy8gTkI6IGhlaWdodCBjYW4gYmUgPCAwIGZvciBCTVAgZGF0YQoJaWYgKGhlaWdodCA+IDApIHsKCQljb3VudCA9IGlvLT5yZWFkX3Byb2MoKHZvaWQgKilGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpLCBoZWlnaHQgKiBwaXRjaCwgMSwgaGFuZGxlKTsKCQlpZihjb3VudCAhPSAxKSB7CgkJCXJldHVybiBGQUxTRTsKCQl9Cgl9IGVsc2UgewoJCWludCBwb3NpdGl2ZUhlaWdodCA9IGFicyhoZWlnaHQpOwoJCWZvciAoaW50IGMgPSAwOyBjIDwgcG9zaXRpdmVIZWlnaHQ7ICsrYykgewoJCQljb3VudCA9IGlvLT5yZWFkX3Byb2MoKHZvaWQgKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCBwb3NpdGl2ZUhlaWdodCAtIGMgLSAxKSwgcGl0Y2gsIDEsIGhhbmRsZSk7CgkJCWlmKGNvdW50ICE9IDEpIHsKCQkJCXJldHVybiBGQUxTRTsKCQkJfQoJCX0KCX0KCgkvLyBzd2FwIGFzIG5lZWRlZAojaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgoJaWYgKGJpdF9jb3VudCA9PSAxNikgewoJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsgeSsrKSB7CgkJCVdPUkQgKnBpeGVsID0gKFdPUkQgKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgRnJlZUltYWdlX0dldFdpZHRoKGRpYik7IHgrKykgewoJCQkJU3dhcFNob3J0KHBpeGVsKTsKCQkJCXBpeGVsKys7CgkJCX0KCQl9Cgl9CiNlbmRpZgojaWYgRlJFRUlNQUdFX0NPTE9ST1JERVIgPT0gRlJFRUlNQUdFX0NPTE9ST1JERVJfUkdCCglpZiAoYml0X2NvdW50ID09IDI0IHx8IGJpdF9jb3VudCA9PSAzMikgewoJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsgeSsrKSB7CgkJCUJZVEUgKnBpeGVsID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CgkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOyB4KyspIHsKCQkJCUlOUExBQ0VTV0FQKHBpeGVsWzBdLCBwaXhlbFsyXSk7CgkJCQlwaXhlbCArPSAoYml0X2NvdW50ID4+IDMpOwoJCQl9CgkJfQoJfQojZW5kaWYKCglyZXR1cm4gVFJVRTsKfQoKLyoqCkxvYWQgaW1hZ2UgcGl4ZWxzIGZvciA0LWJpdCBSTEUgY29tcHJlc3NlZCBkaWIKQHBhcmFtIGlvIEZyZWVJbWFnZSBJTwpAcGFyYW0gaGFuZGxlIEZyZWVJbWFnZSBJTyBoYW5kbGUKQHBhcmFtIHdpZHRoIEltYWdlIHdpZHRoCkBwYXJhbSBoZWlnaHQgSW1hZ2UgaGVpZ2h0CkBwYXJhbSBkaWIgSW1hZ2UgdG8gYmUgbG9hZGVkIApAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQoqLwpzdGF0aWMgQk9PTCAKTG9hZFBpeGVsRGF0YVJMRTQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZJQklUTUFQICpkaWIpIHsKCWludCBzdGF0dXNfYnl0ZSA9IDA7CglCWVRFIHNlY29uZF9ieXRlID0gMDsKCWludCBiaXRzID0gMDsKCglCWVRFICpwaXhlbHMgPSBOVUxMOwkvLyB0ZW1wb3JhcnkgOC1iaXQgYnVmZmVyCgoJdHJ5IHsKCQloZWlnaHQgPSBhYnMoaGVpZ2h0KTsKCgkJcGl4ZWxzID0gKEJZVEUqKW1hbGxvYyh3aWR0aCAqIGhlaWdodCAqIHNpemVvZihCWVRFKSk7CgkJaWYoIXBpeGVscykgdGhyb3coMSk7CgkJbWVtc2V0KHBpeGVscywgMCwgd2lkdGggKiBoZWlnaHQgKiBzaXplb2YoQllURSkpOwoKCQlCWVRFICpxID0gcGl4ZWxzOwoJCUJZVEUgKmVuZCA9IHBpeGVscyArIGhlaWdodCAqIHdpZHRoOwoKCQlmb3IgKGludCBzY2FubGluZSA9IDA7IHNjYW5saW5lIDwgaGVpZ2h0OyApIHsKCQkJaWYgKHEgPCBwaXhlbHMgfHwgcSAgPj0gZW5kKSB7CgkJCQlicmVhazsKCQkJfQoJCQlpZihpby0+cmVhZF9wcm9jKCZzdGF0dXNfYnl0ZSwgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEpIHsKCQkJCXRocm93KDEpOwoJCQl9CgkJCWlmIChzdGF0dXNfYnl0ZSAhPSAwKQl7CgkJCQlzdGF0dXNfYnl0ZSA9IChpbnQpTUlOKChzaXplX3Qpc3RhdHVzX2J5dGUsIChzaXplX3QpKGVuZCAtIHEpKTsKCQkJCS8vIEVuY29kZWQgbW9kZQoJCQkJaWYoaW8tPnJlYWRfcHJvYygmc2Vjb25kX2J5dGUsIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSAhPSAxKSB7CgkJCQkJdGhyb3coMSk7CgkJCQl9CgkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c19ieXRlOyBpKyspCXsKCQkJCQkqcSsrPShCWVRFKSgoaSAmIDB4MDEpID8gKHNlY29uZF9ieXRlICYgMHgwZikgOiAoKHNlY29uZF9ieXRlID4+IDQpICYgMHgwZikpOwoJCQkJfQoJCQkJYml0cyArPSBzdGF0dXNfYnl0ZTsKCQkJfQoJCQllbHNlIHsKCQkJCS8vIEVzY2FwZSBtb2RlCgkJCQlpZihpby0+cmVhZF9wcm9jKCZzdGF0dXNfYnl0ZSwgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEpIHsKCQkJCQl0aHJvdygxKTsKCQkJCX0KCQkJCXN3aXRjaCAoc3RhdHVzX2J5dGUpIHsKCQkJCQljYXNlIFJMRV9FTkRPRkxJTkU6CgkJCQkJewoJCQkJCQkvLyBFbmQgb2YgbGluZQoJCQkJCQliaXRzID0gMDsKCQkJCQkJc2NhbmxpbmUrKzsKCQkJCQkJcSA9IHBpeGVscyArIHNjYW5saW5lKndpZHRoOwoJCQkJCX0KCQkJCQlicmVhazsKCgkJCQkJY2FzZSBSTEVfRU5ET0ZCSVRNQVA6CgkJCQkJCS8vIEVuZCBvZiBiaXRtYXAKCQkJCQkJcSA9IGVuZDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgUkxFX0RFTFRBOgoJCQkJCXsKCQkJCQkJLy8gcmVhZCB0aGUgZGVsdGEgdmFsdWVzCgoJCQkJCQlCWVRFIGRlbHRhX3ggPSAwOwoJCQkJCQlCWVRFIGRlbHRhX3kgPSAwOwoKCQkJCQkJaWYoaW8tPnJlYWRfcHJvYygmZGVsdGFfeCwgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEpIHsKCQkJCQkJCXRocm93KDEpOwoJCQkJCQl9CgkJCQkJCWlmKGlvLT5yZWFkX3Byb2MoJmRlbHRhX3ksIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSAhPSAxKSB7CgkJCQkJCQl0aHJvdygxKTsKCQkJCQkJfQoKCQkJCQkJLy8gYXBwbHkgdGhlbQoKCQkJCQkJYml0cyArPSBkZWx0YV94OwoJCQkJCQlzY2FubGluZSArPSBkZWx0YV95OwoJCQkJCQlxID0gcGl4ZWxzICsgc2NhbmxpbmUqd2lkdGgrYml0czsKCQkJCQl9CgkJCQkJYnJlYWs7CgoJCQkJCWRlZmF1bHQ6CgkJCQkJewoJCQkJCQkvLyBBYnNvbHV0ZSBtb2RlCgkJCQkJCXN0YXR1c19ieXRlID0gKGludClNSU4oKHNpemVfdClzdGF0dXNfYnl0ZSwgKHNpemVfdCkoZW5kIC0gcSkpOwoJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c19ieXRlOyBpKyspIHsKCQkJCQkJCWlmICgoaSAmIDB4MDEpID09IDApIHsKCQkJCQkJCQlpZihpby0+cmVhZF9wcm9jKCZzZWNvbmRfYnl0ZSwgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEpIHsKCQkJCQkJCQkJdGhyb3coMSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJKnErKz0oQllURSkoKGkgJiAweDAxKSA/IChzZWNvbmRfYnl0ZSAmIDB4MGYpIDogKChzZWNvbmRfYnl0ZSA+PiA0KSAmIDB4MGYpKTsKCQkJCQkJfQoJCQkJCQliaXRzICs9IHN0YXR1c19ieXRlOwoJCQkJCQkvLyBSZWFkIHBhZCBieXRlCgkJCQkJCWlmICgoKHN0YXR1c19ieXRlICYgMHgwMykgPT0gMSkgfHwgKChzdGF0dXNfYnl0ZSAmIDB4MDMpID09IDIpKSB7CgkJCQkJCQlCWVRFIHBhZGRpbmcgPSAwOwoJCQkJCQkJaWYoaW8tPnJlYWRfcHJvYygmcGFkZGluZywgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEpIHsKCQkJCQkJCQl0aHJvdygxKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCQkKCQl7CgkJCS8vIENvbnZlcnQgdG8gNC1iaXQKCQkJZm9yKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkJCQljb25zdCBCWVRFICpzcmMgPSAoQllURSopcGl4ZWxzICsgeSAqIHdpZHRoOwoJCQkJQllURSAqZHN0ID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CgoJCQkJQk9PTCBoaW5pYmJsZSA9IFRSVUU7CgoJCQkJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aDsgY29scysrKXsKCQkJCQlpZiAoaGluaWJibGUpIHsKCQkJCQkJZHN0W2NvbHMgPj4gMV0gPSAoc3JjW2NvbHNdIDw8IDQpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWRzdFtjb2xzID4+IDFdIHw9IHNyY1tjb2xzXTsKCQkJCQl9CgoJCQkJCWhpbmliYmxlID0gIWhpbmliYmxlOwoJCQkJfQoJCQl9CgkJfQoKCQlmcmVlKHBpeGVscyk7CgoJCXJldHVybiBUUlVFOwoKCX0gY2F0Y2goaW50KSB7CgkJaWYocGl4ZWxzKSBmcmVlKHBpeGVscyk7CgkJcmV0dXJuIEZBTFNFOwoJfQp9CgovKioKTG9hZCBpbWFnZSBwaXhlbHMgZm9yIDgtYml0IFJMRSBjb21wcmVzc2VkIGRpYgpAcGFyYW0gaW8gRnJlZUltYWdlIElPCkBwYXJhbSBoYW5kbGUgRnJlZUltYWdlIElPIGhhbmRsZQpAcGFyYW0gd2lkdGggSW1hZ2Ugd2lkdGgKQHBhcmFtIGhlaWdodCBJbWFnZSBoZWlnaHQKQHBhcmFtIGRpYiBJbWFnZSB0byBiZSBsb2FkZWQgCkByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgRkFMU0Ugb3RoZXJ3aXNlCiovCnN0YXRpYyBCT09MIApMb2FkUGl4ZWxEYXRhUkxFOChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRklCSVRNQVAgKmRpYikgewoJQllURSBzdGF0dXNfYnl0ZSA9IDA7CglCWVRFIHNlY29uZF9ieXRlID0gMDsKCWludCBzY2FubGluZSA9IDA7CglpbnQgYml0cyA9IDA7CgoJZm9yICg7OykgewoJCWlmKCBpby0+cmVhZF9wcm9jKCZzdGF0dXNfYnl0ZSwgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEpIHsKCQkJcmV0dXJuIEZBTFNFOwoJCX0KCgkJc3dpdGNoIChzdGF0dXNfYnl0ZSkgewoJCQljYXNlIFJMRV9DT01NQU5EIDoKCQkJCWlmKGlvLT5yZWFkX3Byb2MoJnN0YXR1c19ieXRlLCBzaXplb2YoQllURSksIDEsIGhhbmRsZSkgIT0gMSkgewoJCQkJCXJldHVybiBGQUxTRTsKCQkJCX0KCgkJCQlzd2l0Y2ggKHN0YXR1c19ieXRlKSB7CgkJCQkJY2FzZSBSTEVfRU5ET0ZMSU5FIDoKCQkJCQkJYml0cyA9IDA7CgkJCQkJCXNjYW5saW5lKys7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIFJMRV9FTkRPRkJJVE1BUCA6CgkJCQkJCXJldHVybiBUUlVFOwoKCQkJCQljYXNlIFJMRV9ERUxUQSA6CgkJCQkJewoJCQkJCQkvLyByZWFkIHRoZSBkZWx0YSB2YWx1ZXMKCgkJCQkJCUJZVEUgZGVsdGFfeCA9IDA7CgkJCQkJCUJZVEUgZGVsdGFfeSA9IDA7CgoJCQkJCQlpZihpby0+cmVhZF9wcm9jKCZkZWx0YV94LCBzaXplb2YoQllURSksIDEsIGhhbmRsZSkgIT0gMSkgewoJCQkJCQkJcmV0dXJuIEZBTFNFOwoJCQkJCQl9CgkJCQkJCWlmKGlvLT5yZWFkX3Byb2MoJmRlbHRhX3ksIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSAhPSAxKSB7CgkJCQkJCQlyZXR1cm4gRkFMU0U7CgkJCQkJCX0KCgkJCQkJCS8vIGFwcGx5IHRoZW0KCgkJCQkJCWJpdHMgICAgICs9IGRlbHRhX3g7CgkJCQkJCXNjYW5saW5lICs9IGRlbHRhX3k7CgoJCQkJCQlicmVhazsKCQkJCQl9CgoJCQkJCWRlZmF1bHQgOgoJCQkJCXsKCQkJCQkJaWYoc2NhbmxpbmUgPj0gYWJzKGhlaWdodCkpIHsKCQkJCQkJCXJldHVybiBUUlVFOwoJCQkJCQl9CgoJCQkJCQlpbnQgY291bnQgPSBNSU4oKGludClzdGF0dXNfYnl0ZSwgd2lkdGggLSBiaXRzKTsKCgkJCQkJCUJZVEUgKnNsaW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgc2NhbmxpbmUpOwoKCQkJCQkJaWYoaW8tPnJlYWRfcHJvYygodm9pZCAqKShzbGluZSArIGJpdHMpLCBzaXplb2YoQllURSkgKiBjb3VudCwgMSwgaGFuZGxlKSAhPSAxKSB7CgkJCQkJCQlyZXR1cm4gRkFMU0U7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCS8vIGFsaWduIHJ1biBsZW5ndGggdG8gZXZlbiBudW1iZXIgb2YgYnl0ZXMgCgoJCQkJCQlpZiAoKHN0YXR1c19ieXRlICYgMSkgPT0gMSkgewoJCQkJCQkJaWYoaW8tPnJlYWRfcHJvYygmc2Vjb25kX2J5dGUsIHNpemVvZihCWVRFKSwgMSwgaGFuZGxlKSAhPSAxKSB7CgkJCQkJCQkJcmV0dXJuIEZBTFNFOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQliaXRzICs9IHN0YXR1c19ieXRlOwkJCQkJCQkJCQkJCQkKCgkJCQkJCWJyZWFrOwkKCQkJCQl9CgkJCQl9CgoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0IDoKCQkJewoJCQkJaWYoc2NhbmxpbmUgPj0gYWJzKGhlaWdodCkpIHsKCQkJCQlyZXR1cm4gVFJVRTsKCQkJCX0KCgkJCQlpbnQgY291bnQgPSBNSU4oKGludClzdGF0dXNfYnl0ZSwgd2lkdGggLSBiaXRzKTsKCgkJCQlCWVRFICpzbGluZSA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHNjYW5saW5lKTsKCgkJCQlpZihpby0+cmVhZF9wcm9jKCZzZWNvbmRfYnl0ZSwgc2l6ZW9mKEJZVEUpLCAxLCBoYW5kbGUpICE9IDEpIHsKCQkJCQlyZXR1cm4gRkFMU0U7CgkJCQl9CgoJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJCQkJKihzbGluZSArIGJpdHMpID0gc2Vjb25kX2J5dGU7CgoJCQkJCWJpdHMrKzsJCQkJCQoJCQkJfQoKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIEZJQklUTUFQICoKTG9hZFdpbmRvd3NCTVAoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGJpdG1hcF9iaXRzX29mZnNldCwgaW50IHR5cGUpIHsKCUZJQklUTUFQICpkaWIgPSBOVUxMOwoKCXRyeSB7CgkJQk9PTCBoZWFkZXJfb25seSA9IChmbGFncyAmIEZJRl9MT0FEX05PUElYRUxTKSA9PSBGSUZfTE9BRF9OT1BJWEVMUzsKCgkJLy8gbG9hZCB0aGUgaW5mbyBoZWFkZXIKCgkJQklUTUFQSU5GT0hFQURFUiBiaWg7CgoJCWlvLT5yZWFkX3Byb2MoJmJpaCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpLCAxLCBoYW5kbGUpOwojaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgoJCVN3YXBJbmZvSGVhZGVyKCZiaWgpOwojZW5kaWYKCgkJLy8ga2VlcCBzb21lIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpdG1hcAoKCQl1bnNpZ25lZCB1c2VkX2NvbG9ycwk9IGJpaC5iaUNsclVzZWQ7CgkJaW50IHdpZHRoCQkJCT0gYmloLmJpV2lkdGg7CgkJaW50IGhlaWdodAkJCQk9IGJpaC5iaUhlaWdodDsJCS8vIFdBUk5JTkc6IGhlaWdodCBjYW4gYmUgPCAwID0+IGNoZWNrIGVhY2ggY2FsbCB1c2luZyAnaGVpZ2h0JyBhcyBhIHBhcmFtZXRlcgoJCXVuc2lnbmVkIGJpdF9jb3VudAkJPSBiaWguYmlCaXRDb3VudDsKCQl1bnNpZ25lZCBjb21wcmVzc2lvbgk9IGJpaC5iaUNvbXByZXNzaW9uOwoJCXVuc2lnbmVkIHBpdGNoCQkJPSBDYWxjdWxhdGVQaXRjaChDYWxjdWxhdGVMaW5lKHdpZHRoLCBiaXRfY291bnQpKTsKCgkJc3dpdGNoIChiaXRfY291bnQpIHsKCQkJY2FzZSAxIDoKCQkJY2FzZSA0IDoKCQkJY2FzZSA4IDoKCQkJewoJCQkJaWYgKCh1c2VkX2NvbG9ycyA9PSAwKSB8fCAodXNlZF9jb2xvcnMgPiBDYWxjdWxhdGVVc2VkUGFsZXR0ZUVudHJpZXMoYml0X2NvdW50KSkpIHsKCQkJCQl1c2VkX2NvbG9ycyA9IENhbGN1bGF0ZVVzZWRQYWxldHRlRW50cmllcyhiaXRfY291bnQpOwoJCQkJfQoJCQkJCgkJCQkvLyBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIGJpdG1hcCAoaGVhZGVyLCBwYWxldHRlLCBwaXhlbHMpIGFuZCByZWFkIHRoZSBwYWxldHRlCgoJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCBiaXRfY291bnQpOwoJCQkJaWYgKGRpYiA9PSBOVUxMKSB7CgkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CgkJCQl9CgoJCQkJLy8gc2V0IHJlc29sdXRpb24gaW5mb3JtYXRpb24KCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJYKGRpYiwgYmloLmJpWFBlbHNQZXJNZXRlcik7CgkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkaWIsIGJpaC5iaVlQZWxzUGVyTWV0ZXIpOwoKCQkJCS8vIHNlZWsgdG8gdGhlIGVuZCBvZiB0aGUgaGVhZGVyIChkZXBlbmRpbmcgb24gdGhlIEJNUCBoZWFkZXIgdmVyc2lvbikKCQkJCS8vIHR5cGUgPT0gc2l6ZW9mKEJJVE1BUFZ4SU5GT0hFQURFUikKCQkJCXN3aXRjaCh0eXBlKSB7CgkJCQkJY2FzZSA0MDoJLy8gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpIC0gYWxsIFdpbmRvd3MgdmVyc2lvbnMgc2luY2UgV2luZG93cyAzLjAKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA1MjoJLy8gc2l6ZW9mKEJJVE1BUFYySU5GT0hFQURFUikgKHVuZG9jdW1lbnRlZCkKCQkJCQljYXNlIDU2OgkvLyBzaXplb2YoQklUTUFQVjNJTkZPSEVBREVSKSAodW5kb2N1bWVudGVkKQoJCQkJCWNhc2UgMTA4OgkvLyBzaXplb2YoQklUTUFQVjRIRUFERVIpIC0gYWxsIFdpbmRvd3MgdmVyc2lvbnMgc2luY2UgV2luZG93cyA5NS9OVDQgKG5vdCBzdXBwb3J0ZWQpCgkJCQkJY2FzZSAxMjQ6CS8vIHNpemVvZihCSVRNQVBWNUhFQURFUikgLSBXaW5kb3dzIDk4LzIwMDAgYW5kIG5ld2VyIChub3Qgc3VwcG9ydGVkKQoJCQkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgKGxvbmcpKHR5cGUgLSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpLCBTRUVLX0NVUik7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQkJCgkJCQkvLyBsb2FkIHRoZSBwYWxldHRlCgoJCQkJaW8tPnJlYWRfcHJvYyhGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpLCB1c2VkX2NvbG9ycyAqIHNpemVvZihSR0JRVUFEKSwgMSwgaGFuZGxlKTsKI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX1JHQgoJCQkJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB1c2VkX2NvbG9yczsgaSsrKSB7CgkJCQkJSU5QTEFDRVNXQVAocGFsW2ldLnJnYlJlZCwgcGFsW2ldLnJnYkJsdWUpOwoJCQkJfQojZW5kaWYKCgkJCQlpZihoZWFkZXJfb25seSkgewoJCQkJCS8vIGhlYWRlciBvbmx5IG1vZGUKCQkJCQlyZXR1cm4gZGliOwoJCQkJfQoKCQkJCS8vIHNlZWsgdG8gdGhlIGFjdHVhbCBwaXhlbCBkYXRhLgoJCQkJLy8gdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBzb21ldGltZXMgdGhlIHBhbGV0dGUgaXMgbGFyZ2VyIHRoYW4gdGhlIGVudHJpZXMgaXQgY29udGFpbnMgcHJlZGljdHMKCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBiaXRtYXBfYml0c19vZmZzZXQsIFNFRUtfU0VUKTsKCgkJCQkvLyByZWFkIHRoZSBwaXhlbCBkYXRhCgoJCQkJc3dpdGNoIChjb21wcmVzc2lvbikgewoJCQkJCWNhc2UgQklfUkdCIDoKCQkJCQkJaWYoIExvYWRQaXhlbERhdGEoaW8sIGhhbmRsZSwgZGliLCBoZWlnaHQsIHBpdGNoLCBiaXRfY291bnQpICkgewoJCQkJCQkJcmV0dXJuIGRpYjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXRocm93ICJFcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBkZWNvZGluZyBCTVAgZGF0YSI7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgQklfUkxFNCA6CgkJCQkJCWlmKCBMb2FkUGl4ZWxEYXRhUkxFNChpbywgaGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBkaWIpICkgewoJCQkJCQkJcmV0dXJuIGRpYjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXRocm93ICJFcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBkZWNvZGluZyBSTEU0IEJNUCBkYXRhIjsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBCSV9STEU4IDoKCQkJCQkJaWYoIExvYWRQaXhlbERhdGFSTEU4KGlvLCBoYW5kbGUsIHdpZHRoLCBoZWlnaHQsIGRpYikgKSB7CgkJCQkJCQlyZXR1cm4gZGliOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJdGhyb3cgIkVycm9yIGVuY291bnRlcmVkIHdoaWxlIGRlY29kaW5nIFJMRTggQk1QIGRhdGEiOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQlkZWZhdWx0IDoKCQkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OOwoJCQkJfQoJCQl9CgkJCWJyZWFrOyAvLyAxLSwgNC0sIDgtYml0CgoJCQljYXNlIDE2IDoKCQkJewoJCQkJaW50IHVzZV9iaXRmaWVsZHMgPSAwOwoJCQkJaWYgKGJpaC5iaUNvbXByZXNzaW9uID09IEJJX0JJVEZJRUxEUykgdXNlX2JpdGZpZWxkcyA9IDM7CgkJCQllbHNlIGlmIChiaWguYmlDb21wcmVzc2lvbiA9PSBCSV9BTFBIQUJJVEZJRUxEUykgdXNlX2JpdGZpZWxkcyA9IDQ7CgkJCQllbHNlIGlmICh0eXBlID09IDUyKSB1c2VfYml0ZmllbGRzID0gMzsKCQkJCWVsc2UgaWYgKHR5cGUgPj0gNTYpIHVzZV9iaXRmaWVsZHMgPSA0OwoJCQkJCgkJCQlpZiAodXNlX2JpdGZpZWxkcyA+IDApIHsKIAkJCQkJRFdPUkQgYml0ZmllbGRzWzRdOwoJCQkJCWlvLT5yZWFkX3Byb2MoYml0ZmllbGRzLCB1c2VfYml0ZmllbGRzICogc2l6ZW9mKERXT1JEKSwgMSwgaGFuZGxlKTsKCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJpdF9jb3VudCwgYml0ZmllbGRzWzBdLCBiaXRmaWVsZHNbMV0sIGJpdGZpZWxkc1syXSk7CgkJCQl9IGVsc2UgewoJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50LCBGSTE2XzU1NV9SRURfTUFTSywgRkkxNl81NTVfR1JFRU5fTUFTSywgRkkxNl81NTVfQkxVRV9NQVNLKTsKCQkJCX0KCgkJCQlpZiAoZGliID09IE5VTEwpIHsKCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsJCQkJCQkKCQkJCX0KCgkJCQkvLyBzZXQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgoJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoZGliLCBiaWguYmlYUGVsc1Blck1ldGVyKTsKCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJZKGRpYiwgYmloLmJpWVBlbHNQZXJNZXRlcik7CgoJCQkJaWYoaGVhZGVyX29ubHkpIHsKCQkJCQkvLyBoZWFkZXIgb25seSBtb2RlCgkJCQkJcmV0dXJuIGRpYjsKCQkJCX0KCQkJCQoJCQkJLy8gc2VlayB0byB0aGUgYWN0dWFsIHBpeGVsIGRhdGEKCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBiaXRtYXBfYml0c19vZmZzZXQsIFNFRUtfU0VUKTsKCgkJCQkvLyBsb2FkIHBpeGVsIGRhdGEgYW5kIHN3YXAgYXMgbmVlZGVkIGlmIE9TIGlzIEJpZyBFbmRpYW4KCQkJCUxvYWRQaXhlbERhdGEoaW8sIGhhbmRsZSwgZGliLCBoZWlnaHQsIHBpdGNoLCBiaXRfY291bnQpOwoKCQkJCXJldHVybiBkaWI7CgkJCX0KCQkJYnJlYWs7IC8vIDE2LWJpdAoKCQkJY2FzZSAyNCA6CgkJCWNhc2UgMzIgOgoJCQl7CgkJCQlpbnQgdXNlX2JpdGZpZWxkcyA9IDA7CgkJCQlpZiAoYmloLmJpQ29tcHJlc3Npb24gPT0gQklfQklURklFTERTKSB1c2VfYml0ZmllbGRzID0gMzsKCQkJCWVsc2UgaWYgKGJpaC5iaUNvbXByZXNzaW9uID09IEJJX0FMUEhBQklURklFTERTKSB1c2VfYml0ZmllbGRzID0gNDsKCQkJCWVsc2UgaWYgKHR5cGUgPT0gNTIpIHVzZV9iaXRmaWVsZHMgPSAzOwoJCQkJZWxzZSBpZiAodHlwZSA+PSA1NikgdXNlX2JpdGZpZWxkcyA9IDQ7CgogCQkJCWlmICh1c2VfYml0ZmllbGRzID4gMCkgewoJCQkJCURXT1JEIGJpdGZpZWxkc1s0XTsKCQkJCQlpby0+cmVhZF9wcm9jKGJpdGZpZWxkcywgdXNlX2JpdGZpZWxkcyAqIHNpemVvZihEV09SRCksIDEsIGhhbmRsZSk7CgkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCBiaXRfY291bnQsIGJpdGZpZWxkc1swXSwgYml0ZmllbGRzWzFdLCBiaXRmaWVsZHNbMl0pOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiggYml0X2NvdW50ID09IDMyICkgewoJCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJpdF9jb3VudCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCBiaXRfY291bnQsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoZGliID09IE5VTEwpIHsKCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKCQkJCX0KCgkJCQkvLyBzZXQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgoJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoZGliLCBiaWguYmlYUGVsc1Blck1ldGVyKTsKCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJZKGRpYiwgYmloLmJpWVBlbHNQZXJNZXRlcik7CgoJCQkJaWYoaGVhZGVyX29ubHkpIHsKCQkJCQkvLyBoZWFkZXIgb25seSBtb2RlCgkJCQkJcmV0dXJuIGRpYjsKCQkJCX0KCgkJCQkvLyBTa2lwIG92ZXIgdGhlIG9wdGlvbmFsIHBhbGV0dGUgCgkJCQkvLyBBIDI0IG9yIDMyIGJpdCBESUIgbWF5IGNvbnRhaW4gYSBwYWxldHRlIGZvciBmYXN0ZXIgY29sb3IgcmVkdWN0aW9uCgkJCQkvLyBpLmUuIHlvdSBjYW4gaGF2ZSAoRnJlZUltYWdlX0dldENvbG9yc1VzZWQoZGliKSA+IDApCgoJCQkJLy8gc2VlayB0byB0aGUgYWN0dWFsIHBpeGVsIGRhdGEKCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBiaXRtYXBfYml0c19vZmZzZXQsIFNFRUtfU0VUKTsKCgkJCQkvLyByZWFkIGluIHRoZSBiaXRtYXAgYml0cwoJCQkJLy8gbG9hZCBwaXhlbCBkYXRhIGFuZCBzd2FwIGFzIG5lZWRlZCBpZiBPUyBpcyBCaWcgRW5kaWFuCgkJCQlMb2FkUGl4ZWxEYXRhKGlvLCBoYW5kbGUsIGRpYiwgaGVpZ2h0LCBwaXRjaCwgYml0X2NvdW50KTsKCgkJCQkvLyBjaGVjayBpZiB0aGUgYml0bWFwIGNvbnRhaW5zIHRyYW5zcGFyZW5jeSwgaWYgc28gZW5hYmxlIGl0IGluIHRoZSBoZWFkZXIKCgkJCQlGcmVlSW1hZ2VfU2V0VHJhbnNwYXJlbnQoZGliLCAoRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpID09IEZJQ19SR0JBTFBIQSkpOwoKCQkJCXJldHVybiBkaWI7CgkJCX0KCQkJYnJlYWs7IC8vIDI0LSwgMzItYml0CgkJfQoJfSBjYXRjaChjb25zdCBjaGFyICptZXNzYWdlKSB7CgkJaWYoZGliKSB7CgkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKCQl9CgkJaWYobWVzc2FnZSkgewoJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIG1lc3NhZ2UpOwoJCX0KCX0KCglyZXR1cm4gTlVMTDsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyBGSUJJVE1BUCAqCkxvYWRPUzIyWEJNUChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFncywgdW5zaWduZWQgYml0bWFwX2JpdHNfb2Zmc2V0KSB7CglGSUJJVE1BUCAqZGliID0gTlVMTDsKCgl0cnkgewoJCUJPT0wgaGVhZGVyX29ubHkgPSAoZmxhZ3MgJiBGSUZfTE9BRF9OT1BJWEVMUykgPT0gRklGX0xPQURfTk9QSVhFTFM7CgoJCS8vIGxvYWQgdGhlIGluZm8gaGVhZGVyCgoJCUJJVE1BUElORk9IRUFERVIgYmloOwoKCQlpby0+cmVhZF9wcm9jKCZiaWgsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSwgMSwgaGFuZGxlKTsKI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KCQlTd2FwSW5mb0hlYWRlcigmYmloKTsKI2VuZGlmCgoJCS8vIGtlZXAgc29tZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiaXRtYXAKCgkJdW5zaWduZWQgdXNlZF9jb2xvcnMJPSBiaWguYmlDbHJVc2VkOwoJCWludCB3aWR0aAkJCQk9IGJpaC5iaVdpZHRoOwoJCWludCBoZWlnaHQJCQkJPSBiaWguYmlIZWlnaHQ7CQkvLyBXQVJOSU5HOiBoZWlnaHQgY2FuIGJlIDwgMCA9PiBjaGVjayBlYWNoIHJlYWRfcHJvYyB1c2luZyAnaGVpZ2h0JyBhcyBhIHBhcmFtZXRlcgoJCXVuc2lnbmVkIGJpdF9jb3VudAkJPSBiaWguYmlCaXRDb3VudDsKCQl1bnNpZ25lZCBjb21wcmVzc2lvbgk9IGJpaC5iaUNvbXByZXNzaW9uOwoJCXVuc2lnbmVkIHBpdGNoCQkJPSBDYWxjdWxhdGVQaXRjaChDYWxjdWxhdGVMaW5lKHdpZHRoLCBiaXRfY291bnQpKTsKCQkKCQlzd2l0Y2ggKGJpdF9jb3VudCkgewoJCQljYXNlIDEgOgoJCQljYXNlIDQgOgoJCQljYXNlIDggOgoJCQl7CgkJCQlpZiAoKHVzZWRfY29sb3JzID09IDApIHx8ICh1c2VkX2NvbG9ycyA+IENhbGN1bGF0ZVVzZWRQYWxldHRlRW50cmllcyhiaXRfY291bnQpKSkKCQkJCQl1c2VkX2NvbG9ycyA9IENhbGN1bGF0ZVVzZWRQYWxldHRlRW50cmllcyhiaXRfY291bnQpOwoJCQkJCQoJCQkJLy8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBiaXRtYXAgKGhlYWRlciwgcGFsZXR0ZSwgcGl4ZWxzKSBhbmQgcmVhZCB0aGUgcGFsZXR0ZQoKCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50KTsKCgkJCQlpZiAoZGliID09IE5VTEwpIHsKCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKCQkJCX0KCgkJCQkvLyBzZXQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbgoJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoZGliLCBiaWguYmlYUGVsc1Blck1ldGVyKTsKCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJZKGRpYiwgYmloLmJpWVBlbHNQZXJNZXRlcik7CgkJCQkKCQkJCS8vIGxvYWQgdGhlIHBhbGV0dGUKCQkJCS8vIG5vdGUgdGhhdCBpdCBtYXkgY29udGFpbiBSR0Igb3IgUkdCQSB2YWx1ZXMgOiB3ZSB3aWxsIGNhbGN1bGF0ZSB0aGlzCgkJCQl1bnNpZ25lZCBwYWxfc2l6ZSA9IChiaXRtYXBfYml0c19vZmZzZXQgLSBzaXplb2YoQklUTUFQRklMRUhFQURFUikgLSBiaWguYmlTaXplKSAvIHVzZWRfY29sb3JzOyAKCgkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgc2l6ZW9mKEJJVE1BUEZJTEVIRUFERVIpICsgYmloLmJpU2l6ZSwgU0VFS19TRVQpOwoKCQkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CgoJCQkJaWYocGFsX3NpemUgPT0gNCkgewoJCQkJCWZvciAodW5zaWduZWQgY291bnQgPSAwOyBjb3VudCA8IHVzZWRfY29sb3JzOyBjb3VudCsrKSB7CgkJCQkJCUZJTEVfQkdSQSBiZ3JhOwoKCQkJCQkJaW8tPnJlYWRfcHJvYygmYmdyYSwgc2l6ZW9mKEZJTEVfQkdSQSksIDEsIGhhbmRsZSk7CgkJCQkJCQoJCQkJCQlwYWxbY291bnRdLnJnYlJlZAk9IGJncmEucjsKCQkJCQkJcGFsW2NvdW50XS5yZ2JHcmVlbiA9IGJncmEuZzsKCQkJCQkJcGFsW2NvdW50XS5yZ2JCbHVlCT0gYmdyYS5iOwoJCQkJCX0gCgkJCQl9IGVsc2UgaWYocGFsX3NpemUgPT0gMykgewoJCQkJCWZvciAodW5zaWduZWQgY291bnQgPSAwOyBjb3VudCA8IHVzZWRfY29sb3JzOyBjb3VudCsrKSB7CgkJCQkJCUZJTEVfQkdSIGJncjsKCgkJCQkJCWlvLT5yZWFkX3Byb2MoJmJnciwgc2l6ZW9mKEZJTEVfQkdSKSwgMSwgaGFuZGxlKTsKCQkJCQkJCgkJCQkJCXBhbFtjb3VudF0ucmdiUmVkCT0gYmdyLnI7CgkJCQkJCXBhbFtjb3VudF0ucmdiR3JlZW4gPSBiZ3IuZzsKCQkJCQkJcGFsW2NvdW50XS5yZ2JCbHVlCT0gYmdyLmI7CgkJCQkJfSAKCQkJCX0KCQkJCQoJCQkJaWYoaGVhZGVyX29ubHkpIHsKCQkJCQkvLyBoZWFkZXIgb25seSBtb2RlCgkJCQkJcmV0dXJuIGRpYjsKCQkJCX0KCgkJCQkvLyBzZWVrIHRvIHRoZSBhY3R1YWwgcGl4ZWwgZGF0YS4KCQkJCS8vIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZXRpbWVzIHRoZSBwYWxldHRlIGlzIGxhcmdlciB0aGFuIHRoZSBlbnRyaWVzIGl0IGNvbnRhaW5zIHByZWRpY3RzCgoJCQkJaWYgKGJpdG1hcF9iaXRzX29mZnNldCA+IChzaXplb2YoQklUTUFQRklMRUhFQURFUikgKyBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyAodXNlZF9jb2xvcnMgKiAzKSkpIHsKCQkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgYml0bWFwX2JpdHNfb2Zmc2V0LCBTRUVLX1NFVCk7CgkJCQl9CgoJCQkJLy8gcmVhZCB0aGUgcGl4ZWwgZGF0YQoKCQkJCXN3aXRjaCAoY29tcHJlc3Npb24pIHsKCQkJCQljYXNlIEJJX1JHQiA6CgkJCQkJCS8vIGxvYWQgcGl4ZWwgZGF0YSAKCQkJCQkJTG9hZFBpeGVsRGF0YShpbywgaGFuZGxlLCBkaWIsIGhlaWdodCwgcGl0Y2gsIGJpdF9jb3VudCk7CQkJCQkJCgkJCQkJCXJldHVybiBkaWI7CgoJCQkJCWNhc2UgQklfUkxFNCA6CgkJCQkJCWlmKCBMb2FkUGl4ZWxEYXRhUkxFNChpbywgaGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBkaWIpICkgewoJCQkJCQkJcmV0dXJuIGRpYjsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXRocm93ICJFcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBkZWNvZGluZyBSTEU0IEJNUCBkYXRhIjsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBCSV9STEU4IDoKCQkJCQkJaWYoIExvYWRQaXhlbERhdGFSTEU4KGlvLCBoYW5kbGUsIHdpZHRoLCBoZWlnaHQsIGRpYikgKSB7CgkJCQkJCQlyZXR1cm4gZGliOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJdGhyb3cgIkVycm9yIGVuY291bnRlcmVkIHdoaWxlIGRlY29kaW5nIFJMRTggQk1QIGRhdGEiOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQlkZWZhdWx0IDoJCQoJCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfVU5TVVBQT1JURURfQ09NUFJFU1NJT047CgkJCQl9CQoJCQl9CgoJCQljYXNlIDE2IDoKCQkJewoJCQkJaWYgKGJpaC5iaUNvbXByZXNzaW9uID09IDMpIHsKCQkJCQlEV09SRCBiaXRmaWVsZHNbM107CgoJCQkJCWlvLT5yZWFkX3Byb2MoYml0ZmllbGRzLCAzICogc2l6ZW9mKERXT1JEKSwgMSwgaGFuZGxlKTsKCgkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCBiaXRfY291bnQsIGJpdGZpZWxkc1swXSwgYml0ZmllbGRzWzFdLCBiaXRmaWVsZHNbMl0pOwoJCQkJfSBlbHNlIHsKCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJpdF9jb3VudCwgRkkxNl81NTVfUkVEX01BU0ssIEZJMTZfNTU1X0dSRUVOX01BU0ssIEZJMTZfNTU1X0JMVUVfTUFTSyk7CgkJCQl9CgoJCQkJaWYgKGRpYiA9PSBOVUxMKSB7CgkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CgkJCQl9CgoJCQkJLy8gc2V0IHJlc29sdXRpb24gaW5mb3JtYXRpb24KCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJYKGRpYiwgYmloLmJpWFBlbHNQZXJNZXRlcik7CgkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkaWIsIGJpaC5iaVlQZWxzUGVyTWV0ZXIpOwoKCQkJCWlmKGhlYWRlcl9vbmx5KSB7CgkJCQkJLy8gaGVhZGVyIG9ubHkgbW9kZQoJCQkJCXJldHVybiBkaWI7CgkJCQl9CgoJCQkJaWYgKGJpdG1hcF9iaXRzX29mZnNldCA+IChzaXplb2YoQklUTUFQRklMRUhFQURFUikgKyBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyAodXNlZF9jb2xvcnMgKiAzKSkpIHsKCQkJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgYml0bWFwX2JpdHNfb2Zmc2V0LCBTRUVLX1NFVCk7CgkJCQl9CgoJCQkJLy8gbG9hZCBwaXhlbCBkYXRhIGFuZCBzd2FwIGFzIG5lZWRlZCBpZiBPUyBpcyBCaWcgRW5kaWFuCgkJCQlMb2FkUGl4ZWxEYXRhKGlvLCBoYW5kbGUsIGRpYiwgaGVpZ2h0LCBwaXRjaCwgYml0X2NvdW50KTsKCgkJCQlyZXR1cm4gZGliOwoJCQl9CgoJCQljYXNlIDI0IDoKCQkJY2FzZSAzMiA6CgkJCXsKCQkJCWlmKCBiaXRfY291bnQgPT0gMzIgKSB7CgkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCBiaXRfY291bnQsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOwoJCQkJfSBlbHNlIHsKCQkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIHdpZHRoLCBoZWlnaHQsIGJpdF9jb3VudCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CgkJCQl9CgoJCQkJaWYgKGRpYiA9PSBOVUxMKSB7CgkJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CgkJCQl9CgkJCQkKCQkJCS8vIHNldCByZXNvbHV0aW9uIGluZm9ybWF0aW9uCgkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkaWIsIGJpaC5iaVhQZWxzUGVyTWV0ZXIpOwoJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclkoZGliLCBiaWguYmlZUGVsc1Blck1ldGVyKTsKCgkJCQlpZihoZWFkZXJfb25seSkgewoJCQkJCS8vIGhlYWRlciBvbmx5IG1vZGUKCQkJCQlyZXR1cm4gZGliOwoJCQkJfQoKCQkJCS8vIFNraXAgb3ZlciB0aGUgb3B0aW9uYWwgcGFsZXR0ZSAKCQkJCS8vIEEgMjQgb3IgMzIgYml0IERJQiBtYXkgY29udGFpbiBhIHBhbGV0dGUgZm9yIGZhc3RlciBjb2xvciByZWR1Y3Rpb24KCgkJCQlpZiAoYml0bWFwX2JpdHNfb2Zmc2V0ID4gKHNpemVvZihCSVRNQVBGSUxFSEVBREVSKSArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArICh1c2VkX2NvbG9ycyAqIDMpKSkgewoJCQkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCBiaXRtYXBfYml0c19vZmZzZXQsIFNFRUtfU0VUKTsKCQkJCX0KCQkJCQoJCQkJLy8gcmVhZCBpbiB0aGUgYml0bWFwIGJpdHMKCQkJCS8vIGxvYWQgcGl4ZWwgZGF0YSBhbmQgc3dhcCBhcyBuZWVkZWQgaWYgT1MgaXMgQmlnIEVuZGlhbgoJCQkJTG9hZFBpeGVsRGF0YShpbywgaGFuZGxlLCBkaWIsIGhlaWdodCwgcGl0Y2gsIGJpdF9jb3VudCk7CgoJCQkJLy8gY2hlY2sgaWYgdGhlIGJpdG1hcCBjb250YWlucyB0cmFuc3BhcmVuY3ksIGlmIHNvIGVuYWJsZSBpdCBpbiB0aGUgaGVhZGVyCgoJCQkJRnJlZUltYWdlX1NldFRyYW5zcGFyZW50KGRpYiwgKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoZGliKSA9PSBGSUNfUkdCQUxQSEEpKTsKCgkJCQlyZXR1cm4gZGliOwoJCQl9CgkJfQoJfSBjYXRjaChjb25zdCBjaGFyICptZXNzYWdlKSB7CgkJaWYoZGliKQoJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CgoJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgbWVzc2FnZSk7Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgRklCSVRNQVAgKgpMb2FkT1MyMVhCTVAoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGJpdG1hcF9iaXRzX29mZnNldCkgewoJRklCSVRNQVAgKmRpYiA9IE5VTEw7CgoJdHJ5IHsKCQlCT09MIGhlYWRlcl9vbmx5ID0gKGZsYWdzICYgRklGX0xPQURfTk9QSVhFTFMpID09IEZJRl9MT0FEX05PUElYRUxTOwoKCQlCSVRNQVBJTkZPT1MyXzFYX0hFQURFUiBiaW9zMl8xeDsKCgkJaW8tPnJlYWRfcHJvYygmYmlvczJfMXgsIHNpemVvZihCSVRNQVBJTkZPT1MyXzFYX0hFQURFUiksIDEsIGhhbmRsZSk7CiNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCgkJU3dhcE9TMjFYSGVhZGVyKCZiaW9zMl8xeCk7CiNlbmRpZgoJCS8vIGtlZXAgc29tZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiaXRtYXAKCgkJdW5zaWduZWQgdXNlZF9jb2xvcnMgPSAwOwoJCXVuc2lnbmVkIHdpZHRoCQk9IGJpb3MyXzF4LmJpV2lkdGg7CgkJdW5zaWduZWQgaGVpZ2h0CQk9IGJpb3MyXzF4LmJpSGVpZ2h0OwkvLyBXQVJOSU5HOiBoZWlnaHQgY2FuIGJlIDwgMCA9PiBjaGVjayBlYWNoIHJlYWRfcHJvYyB1c2luZyAnaGVpZ2h0JyBhcyBhIHBhcmFtZXRlcgoJCXVuc2lnbmVkIGJpdF9jb3VudAk9IGJpb3MyXzF4LmJpQml0Q291bnQ7CgkJdW5zaWduZWQgcGl0Y2gJCT0gQ2FsY3VsYXRlUGl0Y2goQ2FsY3VsYXRlTGluZSh3aWR0aCwgYml0X2NvdW50KSk7CgkJCgkJc3dpdGNoIChiaXRfY291bnQpIHsKCQkJY2FzZSAxIDoKCQkJY2FzZSA0IDoKCQkJY2FzZSA4IDoKCQkJewoJCQkJdXNlZF9jb2xvcnMgPSBDYWxjdWxhdGVVc2VkUGFsZXR0ZUVudHJpZXMoYml0X2NvdW50KTsKCQkJCQoJCQkJLy8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBiaXRtYXAgKGhlYWRlciwgcGFsZXR0ZSwgcGl4ZWxzKSBhbmQgcmVhZCB0aGUgcGFsZXR0ZQoKCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50KTsKCgkJCQlpZiAoZGliID09IE5VTEwpIHsKCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKCQkJCX0KCgkJCQkvLyBzZXQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiB0byBkZWZhdWx0IHZhbHVlcyAoNzIgZHBpIGluIGVuZ2xpc2ggdW5pdHMpCgkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkaWIsIDI4MzUpOwoJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclkoZGliLCAyODM1KTsKCQkJCQoJCQkJLy8gbG9hZCB0aGUgcGFsZXR0ZQoKCQkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CgoJCQkJZm9yICh1bnNpZ25lZCBjb3VudCA9IDA7IGNvdW50IDwgdXNlZF9jb2xvcnM7IGNvdW50KyspIHsKCQkJCQlGSUxFX0JHUiBiZ3I7CgoJCQkJCWlvLT5yZWFkX3Byb2MoJmJnciwgc2l6ZW9mKEZJTEVfQkdSKSwgMSwgaGFuZGxlKTsKCQkJCQkKCQkJCQlwYWxbY291bnRdLnJnYlJlZAk9IGJnci5yOwoJCQkJCXBhbFtjb3VudF0ucmdiR3JlZW4gPSBiZ3IuZzsKCQkJCQlwYWxbY291bnRdLnJnYkJsdWUJPSBiZ3IuYjsKCQkJCX0KCQkJCQoJCQkJaWYoaGVhZGVyX29ubHkpIHsKCQkJCQkvLyBoZWFkZXIgb25seSBtb2RlCgkJCQkJcmV0dXJuIGRpYjsKCQkJCX0KCgkJCQkvLyBTa2lwIG92ZXIgdGhlIG9wdGlvbmFsIHBhbGV0dGUgCgkJCQkvLyBBIDI0IG9yIDMyIGJpdCBESUIgbWF5IGNvbnRhaW4gYSBwYWxldHRlIGZvciBmYXN0ZXIgY29sb3IgcmVkdWN0aW9uCgoJCQkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIGJpdG1hcF9iaXRzX29mZnNldCwgU0VFS19TRVQpOwoJCQkJCgkJCQkvLyByZWFkIHRoZSBwaXhlbCBkYXRhCgoJCQkJLy8gbG9hZCBwaXhlbCBkYXRhIAoJCQkJTG9hZFBpeGVsRGF0YShpbywgaGFuZGxlLCBkaWIsIGhlaWdodCwgcGl0Y2gsIGJpdF9jb3VudCk7CgkJCQkJCQoJCQkJcmV0dXJuIGRpYjsKCQkJfQoKCQkJY2FzZSAxNiA6CgkJCXsKCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50LCBGSTE2XzU1NV9SRURfTUFTSywgRkkxNl81NTVfR1JFRU5fTUFTSywgRkkxNl81NTVfQkxVRV9NQVNLKTsKCgkJCQlpZiAoZGliID09IE5VTEwpIHsKCQkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsJCQkJCQkKCQkJCX0KCgkJCQkvLyBzZXQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiB0byBkZWZhdWx0IHZhbHVlcyAoNzIgZHBpIGluIGVuZ2xpc2ggdW5pdHMpCgkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWChkaWIsIDI4MzUpOwoJCQkJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclkoZGliLCAyODM1KTsKCgkJCQlpZihoZWFkZXJfb25seSkgewoJCQkJCS8vIGhlYWRlciBvbmx5IG1vZGUKCQkJCQlyZXR1cm4gZGliOwoJCQkJfQoKCQkJCS8vIGxvYWQgcGl4ZWwgZGF0YSBhbmQgc3dhcCBhcyBuZWVkZWQgaWYgT1MgaXMgQmlnIEVuZGlhbgoJCQkJTG9hZFBpeGVsRGF0YShpbywgaGFuZGxlLCBkaWIsIGhlaWdodCwgcGl0Y2gsIGJpdF9jb3VudCk7CgoJCQkJcmV0dXJuIGRpYjsKCQkJfQoKCQkJY2FzZSAyNCA6CgkJCWNhc2UgMzIgOgoJCQl7CgkJCQlpZiggYml0X2NvdW50ID09IDMyICkgewoJCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgd2lkdGgsIGhlaWdodCwgYml0X2NvdW50LCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKCQkJCX0gZWxzZSB7CgkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCB3aWR0aCwgaGVpZ2h0LCBiaXRfY291bnQsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOwoJCQkJfQoKCQkJCWlmIChkaWIgPT0gTlVMTCkgewoJCQkJCXRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOwkJCQkJCQoJCQkJfQoKCQkJCS8vIHNldCByZXNvbHV0aW9uIGluZm9ybWF0aW9uIHRvIGRlZmF1bHQgdmFsdWVzICg3MiBkcGkgaW4gZW5nbGlzaCB1bml0cykKCQkJCUZyZWVJbWFnZV9TZXREb3RzUGVyTWV0ZXJYKGRpYiwgMjgzNSk7CgkJCQlGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShkaWIsIDI4MzUpOwoKCQkJCWlmKGhlYWRlcl9vbmx5KSB7CgkJCQkJLy8gaGVhZGVyIG9ubHkgbW9kZQoJCQkJCXJldHVybiBkaWI7CgkJCQl9CgoJCQkJLy8gU2tpcCBvdmVyIHRoZSBvcHRpb25hbCBwYWxldHRlIAoJCQkJLy8gQSAyNCBvciAzMiBiaXQgRElCIG1heSBjb250YWluIGEgcGFsZXR0ZSBmb3IgZmFzdGVyIGNvbG9yIHJlZHVjdGlvbgoKCQkJCS8vIGxvYWQgcGl4ZWwgZGF0YSBhbmQgc3dhcCBhcyBuZWVkZWQgaWYgT1MgaXMgQmlnIEVuZGlhbgoJCQkJTG9hZFBpeGVsRGF0YShpbywgaGFuZGxlLCBkaWIsIGhlaWdodCwgcGl0Y2gsIGJpdF9jb3VudCk7CgoJCQkJLy8gY2hlY2sgaWYgdGhlIGJpdG1hcCBjb250YWlucyB0cmFuc3BhcmVuY3ksIGlmIHNvIGVuYWJsZSBpdCBpbiB0aGUgaGVhZGVyCgoJCQkJRnJlZUltYWdlX1NldFRyYW5zcGFyZW50KGRpYiwgKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoZGliKSA9PSBGSUNfUkdCQUxQSEEpKTsKCgkJCQlyZXR1cm4gZGliOwoJCQl9CgkJfQoJfSBjYXRjaChjb25zdCBjaGFyICptZXNzYWdlKSB7CQoJCWlmKGRpYikKCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOwoKCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIG1lc3NhZ2UpOwoJfQoKCXJldHVybiBOVUxMOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpGb3JtYXQoKSB7CglyZXR1cm4gIkJNUCI7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCkRlc2NyaXB0aW9uKCkgewoJcmV0dXJuICJXaW5kb3dzIG9yIE9TLzIgQml0bWFwIjsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRXh0ZW5zaW9uKCkgewoJcmV0dXJuICJibXAiOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpSZWdFeHByKCkgewoJcmV0dXJuICJeQk0iOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpNaW1lVHlwZSgpIHsKCXJldHVybiAiaW1hZ2UvYm1wIjsKfQoKc3RhdGljIEJPT0wgRExMX0NBTExDT05WClZhbGlkYXRlKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgewoJQllURSBibXBfc2lnbmF0dXJlMVtdID0geyAweDQyLCAweDREIH07CglCWVRFIGJtcF9zaWduYXR1cmUyW10gPSB7IDB4NDIsIDB4NDEgfTsKCUJZVEUgc2lnbmF0dXJlWzJdID0geyAwLCAwIH07CgoJaW8tPnJlYWRfcHJvYyhzaWduYXR1cmUsIDEsIHNpemVvZihibXBfc2lnbmF0dXJlMSksIGhhbmRsZSk7CgoJaWYgKG1lbWNtcChibXBfc2lnbmF0dXJlMSwgc2lnbmF0dXJlLCBzaXplb2YoYm1wX3NpZ25hdHVyZTEpKSA9PSAwKQoJCXJldHVybiBUUlVFOwoKCWlmIChtZW1jbXAoYm1wX3NpZ25hdHVyZTIsIHNpZ25hdHVyZSwgc2l6ZW9mKGJtcF9zaWduYXR1cmUyKSkgPT0gMCkKCQlyZXR1cm4gVFJVRTsKCglyZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgewoJcmV0dXJuICgKCQkJKGRlcHRoID09IDEpIHx8CgkJCShkZXB0aCA9PSA0KSB8fAoJCQkoZGVwdGggPT0gOCkgfHwKCQkJKGRlcHRoID09IDE2KSB8fAoJCQkoZGVwdGggPT0gMjQpIHx8CgkJCShkZXB0aCA9PSAzMikKCQkpOwp9CgpzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgClN1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgewoJcmV0dXJuICh0eXBlID09IEZJVF9CSVRNQVApID8gVFJVRSA6IEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKU3VwcG9ydHNOb1BpeGVscygpIHsKCXJldHVybiBUUlVFOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKCWlmIChoYW5kbGUgIT0gTlVMTCkgewoJCUJJVE1BUEZJTEVIRUFERVIgYml0bWFwZmlsZWhlYWRlcjsKCQlEV09SRCB0eXBlID0gMDsKCgkJLy8gd2UgdXNlIHRoaXMgb2Zmc2V0IHZhbHVlIHRvIG1ha2Ugc2VlbWluZ2x5IGFic29sdXRlIHNlZWtzIHJlbGF0aXZlIGluIHRoZSBmaWxlCgkJCgkJbG9uZyBvZmZzZXRfaW5fZmlsZSA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKCgkJLy8gcmVhZCB0aGUgZmlsZWhlYWRlcgoKCQlpby0+cmVhZF9wcm9jKCZiaXRtYXBmaWxlaGVhZGVyLCBzaXplb2YoQklUTUFQRklMRUhFQURFUiksIDEsIGhhbmRsZSk7CiNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCgkJU3dhcEZpbGVIZWFkZXIoJmJpdG1hcGZpbGVoZWFkZXIpOwojZW5kaWYKCgkJLy8gY2hlY2sgdGhlIHNpZ25hdHVyZQoKCQlpZigoYml0bWFwZmlsZWhlYWRlci5iZlR5cGUgIT0gMHg0RDQyKSAmJiAoYml0bWFwZmlsZWhlYWRlci5iZlR5cGUgIT0gMHg0MTQyKSkgewoJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIEZJX01TR19FUlJPUl9NQUdJQ19OVU1CRVIpOwoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCS8vIHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGluZm9oZWFkZXIKCgkJaW8tPnJlYWRfcHJvYygmdHlwZSwgc2l6ZW9mKERXT1JEKSwgMSwgaGFuZGxlKTsKCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgMCAtIChsb25nKXNpemVvZihEV09SRCksIFNFRUtfQ1VSKTsKI2lmZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KCQlTd2FwTG9uZygmdHlwZSk7CiNlbmRpZgoKCQkvLyBjYWxsIHRoZSBhcHByb3ByaWF0ZSBsb2FkIGZ1bmN0aW9uIGZvciB0aGUgZm91bmQgYml0bWFwIHR5cGUKCgkJc3dpdGNoKHR5cGUpIHsKCQkJY2FzZSAxMjoKCQkJCS8vIE9TLzIgYW5kIGFsc28gYWxsIFdpbmRvd3MgdmVyc2lvbnMgc2luY2UgV2luZG93cyAzLjAKCQkJCXJldHVybiBMb2FkT1MyMVhCTVAoaW8sIGhhbmRsZSwgZmxhZ3MsIG9mZnNldF9pbl9maWxlICsgYml0bWFwZmlsZWhlYWRlci5iZk9mZkJpdHMpOwoKCQkJY2FzZSA2NDoKCQkJCS8vIE9TLzIKCQkJCXJldHVybiBMb2FkT1MyMlhCTVAoaW8sIGhhbmRsZSwgZmxhZ3MsIG9mZnNldF9pbl9maWxlICsgYml0bWFwZmlsZWhlYWRlci5iZk9mZkJpdHMpOwoKCQkJY2FzZSA0MDoJLy8gQklUTUFQSU5GT0hFQURFUiAtIGFsbCBXaW5kb3dzIHZlcnNpb25zIHNpbmNlIFdpbmRvd3MgMy4wCgkJCWNhc2UgNTI6CS8vIEJJVE1BUFYySU5GT0hFQURFUiAodW5kb2N1bWVudGVkLCBwYXJ0aWFsbHkgc3VwcG9ydGVkKQoJCQljYXNlIDU2OgkvLyBCSVRNQVBWM0lORk9IRUFERVIgKHVuZG9jdW1lbnRlZCwgcGFydGlhbGx5IHN1cHBvcnRlZCkKCQkJY2FzZSAxMDg6CS8vIEJJVE1BUFY0SEVBREVSIC0gYWxsIFdpbmRvd3MgdmVyc2lvbnMgc2luY2UgV2luZG93cyA5NS9OVDQgKHBhcnRpYWxseSBzdXBwb3J0ZWQpCgkJCWNhc2UgMTI0OgkvLyBCSVRNQVBWNUhFQURFUiAtIFdpbmRvd3MgOTgvMjAwMCBhbmQgbmV3ZXIgKHBhcnRpYWxseSBzdXBwb3J0ZWQpCgkJCQlyZXR1cm4gTG9hZFdpbmRvd3NCTVAoaW8sIGhhbmRsZSwgZmxhZ3MsIG9mZnNldF9pbl9maWxlICsgYml0bWFwZmlsZWhlYWRlci5iZk9mZkJpdHMsIHR5cGUpOwoKCQkJZGVmYXVsdDoKCQkJCWJyZWFrOwoJCX0KCgkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCAidW5rbm93biBibXAgc3VidHlwZSB3aXRoIGlkICVkIiwgdHlwZSk7Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qKgpFbmNvZGUgYSA4LWJpdCBzb3VyY2UgYnVmZmVyIGludG8gYSA4LWJpdCB0YXJnZXQgYnVmZmVyIHVzaW5nIGEgUkxFIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gClRoZSBzaXplIG9mIHRoZSB0YXJnZXQgYnVmZmVyIG11c3QgYmUgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHNvdXJjZSBidWZmZXIuIApPbiByZXR1cm4sIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgcmVhbCBzaXplIG9mIHRoZSB0YXJnZXQgYnVmZmVyLCB3aGljaCBzaG91bGQgYmUgbGVzcyB0aGF0IG9yIGVxdWFsIHRvIHRoZSBzb3VyY2UgYnVmZmVyIHNpemUuIApAcGFyYW0gdGFyZ2V0IDgtYml0IFRhcmdldCBidWZmZXIKQHBhcmFtIHNvdXJjZSA4LWJpdCBTb3VyY2UgYnVmZmVyCkBwYXJhbSBzaXplIFNvdXJjZS9UYXJnZXQgaW5wdXQgYnVmZmVyIHNpemUKQHJldHVybiBSZXR1cm5zIHRoZSB0YXJnZXQgYnVmZmVyIHNpemUKKi8Kc3RhdGljIGludApSTEVFbmNvZGVMaW5lKEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgc2l6ZSkgewoJQllURSBidWZmZXJbMjU2XTsKCWludCBidWZmZXJfc2l6ZSA9IDA7CglpbnQgdGFyZ2V0X3BvcyA9IDA7CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKCQlpZiAoKGkgPCBzaXplIC0gMSkgJiYgKHNvdXJjZVtpXSA9PSBzb3VyY2VbaSArIDFdKSkgewoJCQkvLyBmaW5kIGEgc29saWQgYmxvY2sgb2Ygc2FtZSBieXRlcwoKCQkJaW50IGogPSBpICsgMTsKCQkJaW50IGptYXggPSAyNTQgKyBpOwoKCQkJd2hpbGUgKChqIDwgc2l6ZSAtIDEpICYmIChqIDwgam1heCkgJiYgKHNvdXJjZVtqXSA9PSBzb3VyY2VbaiArIDFdKSkKCQkJCSsrajsKCgkJCS8vIGlmIHRoZSBibG9jayBpcyBsYXJnZXIgdGhhbiAzIGJ5dGVzLCB1c2UgaXQKCQkJLy8gZWxzZSBwdXQgdGhlIGRhdGEgaW50byB0aGUgbGFyZ2VyIHBvb2wKCgkJCWlmICgoKGogLSBpKSArIDEpID4gMykgewoJCQkJLy8gZG9uJ3QgZm9yZ2V0IHRvIHdyaXRlIHdoYXQgd2UgYWxyZWFkeSBoYXZlIGluIHRoZSBidWZmZXIKCgkJCQlzd2l0Y2goYnVmZmVyX3NpemUpIHsKCQkJCQljYXNlIDAgOgoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBSTEVfREVMVEEgOgoJCQkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IDE7CgkJCQkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gYnVmZmVyWzBdOwoJCQkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IDE7CgkJCQkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gYnVmZmVyWzFdOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBSTEVfRU5ET0ZCSVRNQVAgOgoJCQkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IChCWVRFKWJ1ZmZlcl9zaXplOwoJCQkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IGJ1ZmZlclswXTsKCQkJCQkJYnJlYWs7CgoJCQkJCWRlZmF1bHQgOgoJCQkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IFJMRV9DT01NQU5EOwoJCQkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IChCWVRFKWJ1ZmZlcl9zaXplOwoJCQkJCQltZW1jcHkodGFyZ2V0ICsgdGFyZ2V0X3BvcywgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CgoJCQkJCQkvLyBwcmVwYXJlIGZvciBuZXh0IHJ1bgoJCQkJCQkKCQkJCQkJdGFyZ2V0X3BvcyArPSBidWZmZXJfc2l6ZTsKCgkJCQkJCWlmICgoYnVmZmVyX3NpemUgJiAxKSA9PSAxKQoJCQkJCQkJdGFyZ2V0X3BvcysrOwoKCQkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJLy8gd3JpdGUgdGhlIGNvbnRpbnVvdXMgZGF0YQoKCQkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gKEJZVEUpKChqIC0gaSkgKyAxKTsKCQkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gc291cmNlW2ldOwoKCQkJCWJ1ZmZlcl9zaXplID0gMDsKCQkJfSBlbHNlIHsKCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgKGogLSBpKSArIDE7ICsraykgewoJCQkJCWJ1ZmZlcltidWZmZXJfc2l6ZSsrXSA9IHNvdXJjZVtpICsga107CgoJCQkJCWlmIChidWZmZXJfc2l6ZSA9PSAyNTQpIHsKCQkJCQkJLy8gd3JpdGUgd2hhdCB3ZSBoYXZlCgoJCQkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IFJMRV9DT01NQU5EOwoJCQkJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IChCWVRFKWJ1ZmZlcl9zaXplOwoJCQkJCQltZW1jcHkodGFyZ2V0ICsgdGFyZ2V0X3BvcywgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CgoJCQkJCQkvLyBwcmVwYXJlIGZvciBuZXh0IHJ1bgoKCQkJCQkJdGFyZ2V0X3BvcyArPSBidWZmZXJfc2l6ZTsKCQkJCQkJYnVmZmVyX3NpemUgPSAwOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaSA9IGo7CgkJfSBlbHNlIHsKCQkJYnVmZmVyW2J1ZmZlcl9zaXplKytdID0gc291cmNlW2ldOwoJCX0KCgkJLy8gd3JpdGUgdGhlIGJ1ZmZlciBpZiBpdCdzIGZ1bGwKCgkJaWYgKGJ1ZmZlcl9zaXplID09IDI1NCkgewoJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IFJMRV9DT01NQU5EOwoJCQl0YXJnZXRbdGFyZ2V0X3BvcysrXSA9IChCWVRFKWJ1ZmZlcl9zaXplOwoJCQltZW1jcHkodGFyZ2V0ICsgdGFyZ2V0X3BvcywgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CgoJCQkvLyBwcmVwYXJlIGZvciBuZXh0IHJ1bgoKCQkJdGFyZ2V0X3BvcyArPSBidWZmZXJfc2l6ZTsKCQkJYnVmZmVyX3NpemUgPSAwOwoJCX0KCX0KCgkvLyB3cml0ZSB0aGUgbGFzdCBieXRlcwoKCXN3aXRjaChidWZmZXJfc2l6ZSkgewoJCWNhc2UgMCA6CgkJCWJyZWFrOwoKCQljYXNlIFJMRV9ERUxUQSA6CgkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gMTsKCQkJdGFyZ2V0W3RhcmdldF9wb3MrK10gPSBidWZmZXJbMF07CgkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gMTsKCQkJdGFyZ2V0W3RhcmdldF9wb3MrK10gPSBidWZmZXJbMV07CgkJCWJyZWFrOwoKCQljYXNlIFJMRV9FTkRPRkJJVE1BUCA6CgkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gKEJZVEUpYnVmZmVyX3NpemU7CgkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gYnVmZmVyWzBdOwoJCQlicmVhazsKCgkJZGVmYXVsdCA6CgkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gUkxFX0NPTU1BTkQ7CgkJCXRhcmdldFt0YXJnZXRfcG9zKytdID0gKEJZVEUpYnVmZmVyX3NpemU7CgkJCW1lbWNweSh0YXJnZXQgKyB0YXJnZXRfcG9zLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKCgkJCS8vIHByZXBhcmUgZm9yIG5leHQgcnVuCgkJCQoJCQl0YXJnZXRfcG9zICs9IGJ1ZmZlcl9zaXplOwoKCQkJaWYgKChidWZmZXJfc2l6ZSAmIDEpID09IDEpCgkJCQl0YXJnZXRfcG9zKys7CgoJCQlicmVhazsJCQkKCX0KCgkvLyB3cml0ZSB0aGUgRU5EX09GX0xJTkUgbWFya2VyCgoJdGFyZ2V0W3RhcmdldF9wb3MrK10gPSBSTEVfQ09NTUFORDsKCXRhcmdldFt0YXJnZXRfcG9zKytdID0gUkxFX0VORE9GTElORTsKCgkvLyByZXR1cm4gdGhlIHdyaXR0ZW4gc2l6ZQoKCXJldHVybiB0YXJnZXRfcG9zOwp9CgpzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKU2F2ZShGcmVlSW1hZ2VJTyAqaW8sIEZJQklUTUFQICpkaWIsIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKCWlmICgoZGliICE9IE5VTEwpICYmIChoYW5kbGUgIT0gTlVMTCkpIHsKCQkvLyB3cml0ZSB0aGUgZmlsZSBoZWFkZXIKCgkJQklUTUFQRklMRUhFQURFUiBiaXRtYXBmaWxlaGVhZGVyOwoJCWJpdG1hcGZpbGVoZWFkZXIuYmZUeXBlID0gMHg0RDQyOwoJCWJpdG1hcGZpbGVoZWFkZXIuYmZPZmZCaXRzID0gc2l6ZW9mKEJJVE1BUEZJTEVIRUFERVIpICsgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsgRnJlZUltYWdlX0dldENvbG9yc1VzZWQoZGliKSAqIHNpemVvZihSR0JRVUFEKTsKCQliaXRtYXBmaWxlaGVhZGVyLmJmU2l6ZSA9IGJpdG1hcGZpbGVoZWFkZXIuYmZPZmZCaXRzICsgRnJlZUltYWdlX0dldEhlaWdodChkaWIpICogRnJlZUltYWdlX0dldFBpdGNoKGRpYik7CgkJYml0bWFwZmlsZWhlYWRlci5iZlJlc2VydmVkMSA9IDA7CgkJYml0bWFwZmlsZWhlYWRlci5iZlJlc2VydmVkMiA9IDA7CgoJCS8vIHRha2UgY2FyZSBvZiB0aGUgYml0IGZpZWxkcyBkYXRhIG9mIGFueQoKCQlib29sIGJpdF9maWVsZHMgPSAoRnJlZUltYWdlX0dldEJQUChkaWIpID09IDE2KTsKCgkJaWYgKGJpdF9maWVsZHMpIHsKCQkJYml0bWFwZmlsZWhlYWRlci5iZlNpemUgKz0gMyAqIHNpemVvZihEV09SRCk7CgkJCWJpdG1hcGZpbGVoZWFkZXIuYmZPZmZCaXRzICs9IDMgKiBzaXplb2YoRFdPUkQpOwoJCX0KCiNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCgkJU3dhcEZpbGVIZWFkZXIoJmJpdG1hcGZpbGVoZWFkZXIpOwojZW5kaWYKCQlpZiAoaW8tPndyaXRlX3Byb2MoJmJpdG1hcGZpbGVoZWFkZXIsIHNpemVvZihCSVRNQVBGSUxFSEVBREVSKSwgMSwgaGFuZGxlKSAhPSAxKQoJCQlyZXR1cm4gRkFMU0U7CQkKCgkJLy8gdXBkYXRlIHRoZSBiaXRtYXAgaW5mbyBoZWFkZXIKCgkJQklUTUFQSU5GT0hFQURFUiBiaWg7CgkJbWVtY3B5KCZiaWgsIEZyZWVJbWFnZV9HZXRJbmZvSGVhZGVyKGRpYiksIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7CgoJCWlmIChiaXRfZmllbGRzKQoJCQliaWguYmlDb21wcmVzc2lvbiA9IEJJX0JJVEZJRUxEUzsKCQllbHNlIGlmICgoYmloLmJpQml0Q291bnQgPT0gOCkgJiYgKGZsYWdzICYgQk1QX1NBVkVfUkxFKSkKCQkJYmloLmJpQ29tcHJlc3Npb24gPSBCSV9STEU4OwoJCWVsc2UKCQkJYmloLmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7CgoJCS8vIHdyaXRlIHRoZSBiaXRtYXAgaW5mbyBoZWFkZXIKCiNpZmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCgkJU3dhcEluZm9IZWFkZXIoJmJpaCk7CiNlbmRpZgoJCWlmIChpby0+d3JpdGVfcHJvYygmYmloLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUiksIDEsIGhhbmRsZSkgIT0gMSkKCQkJcmV0dXJuIEZBTFNFOwoKCQkvLyB3cml0ZSB0aGUgYml0IGZpZWxkcyB3aGVuIHdlIGFyZSBkZWFsaW5nIHdpdGggYSAxNiBiaXQgQk1QCgoJCWlmIChiaXRfZmllbGRzKSB7CgkJCURXT1JEIGQ7CgoJCQlkID0gRnJlZUltYWdlX0dldFJlZE1hc2soZGliKTsKCgkJCWlmIChpby0+d3JpdGVfcHJvYygmZCwgc2l6ZW9mKERXT1JEKSwgMSwgaGFuZGxlKSAhPSAxKQoJCQkJcmV0dXJuIEZBTFNFOwoKCQkJZCA9IEZyZWVJbWFnZV9HZXRHcmVlbk1hc2soZGliKTsKCgkJCWlmIChpby0+d3JpdGVfcHJvYygmZCwgc2l6ZW9mKERXT1JEKSwgMSwgaGFuZGxlKSAhPSAxKQoJCQkJcmV0dXJuIEZBTFNFOwoKCQkJZCA9IEZyZWVJbWFnZV9HZXRCbHVlTWFzayhkaWIpOwoKCQkJaWYgKGlvLT53cml0ZV9wcm9jKCZkLCBzaXplb2YoRFdPUkQpLCAxLCBoYW5kbGUpICE9IDEpCgkJCQlyZXR1cm4gRkFMU0U7CgkJfQoKCQkvLyB3cml0ZSB0aGUgcGFsZXR0ZQoKCQlpZiAoRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSAhPSBOVUxMKSB7CgkJCVJHQlFVQUQgKnBhbCA9IEZyZWVJbWFnZV9HZXRQYWxldHRlKGRpYik7CgkJCUZJTEVfQkdSQSBiZ3JhOwoJCQlmb3IodW5zaWduZWQgaSA9IDA7IGkgPCBGcmVlSW1hZ2VfR2V0Q29sb3JzVXNlZChkaWIpOyBpKysgKSB7CgkJCQliZ3JhLmIgPSBwYWxbaV0ucmdiQmx1ZTsKCQkJCWJncmEuZyA9IHBhbFtpXS5yZ2JHcmVlbjsKCQkJCWJncmEuciA9IHBhbFtpXS5yZ2JSZWQ7CgkJCQliZ3JhLmEgPSBwYWxbaV0ucmdiUmVzZXJ2ZWQ7CgkJCQlpZiAoaW8tPndyaXRlX3Byb2MoJmJncmEsIHNpemVvZihGSUxFX0JHUkEpLCAxLCBoYW5kbGUpICE9IDEpCgkJCQkJcmV0dXJuIEZBTFNFOwoJCQl9CgkJfQoKCQkvLyB3cml0ZSB0aGUgYml0bWFwIGRhdGEuLi4gaWYgUkxFIGNvbXByZXNzaW9uIGlzIGVuYWJsZSwgdXNlIGl0CgoJCXVuc2lnbmVkIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoZGliKTsKCQlpZiAoKGJwcCA9PSA4KSAmJiAoZmxhZ3MgJiBCTVBfU0FWRV9STEUpKSB7CgkJCUJZVEUgKmJ1ZmZlciA9IChCWVRFKiltYWxsb2MoRnJlZUltYWdlX0dldFBpdGNoKGRpYikgKiAyICogc2l6ZW9mKEJZVEUpKTsKCgkJCWZvciAoRFdPUkQgaSA9IDA7IGkgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7ICsraSkgewoJCQkJaW50IHNpemUgPSBSTEVFbmNvZGVMaW5lKGJ1ZmZlciwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaSksIEZyZWVJbWFnZV9HZXRMaW5lKGRpYikpOwoKCQkJCWlmIChpby0+d3JpdGVfcHJvYyhidWZmZXIsIHNpemUsIDEsIGhhbmRsZSkgIT0gMSkgewoJCQkJCWZyZWUoYnVmZmVyKTsKCQkJCQlyZXR1cm4gRkFMU0U7CgkJCQl9CgkJCX0KCgkJCWJ1ZmZlclswXSA9IFJMRV9DT01NQU5EOwoJCQlidWZmZXJbMV0gPSBSTEVfRU5ET0ZCSVRNQVA7CgoJCQlpZiAoaW8tPndyaXRlX3Byb2MoYnVmZmVyLCAyLCAxLCBoYW5kbGUpICE9IDEpIHsKCQkJCWZyZWUoYnVmZmVyKTsKCQkJCXJldHVybiBGQUxTRTsKCQkJfQoKCQkJZnJlZShidWZmZXIpOwojaWZkZWYgRlJFRUlNQUdFX0JJR0VORElBTgoJCX0gZWxzZSBpZiAoYnBwID09IDE2KSB7CgkJCWludCBwYWRkaW5nID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYikgLSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKSAqIHNpemVvZihXT1JEKTsKCQkJV09SRCBwYWQgPSAwOwoJCQlXT1JEIHBpeGVsOwoJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7IHkrKykgewoJCQkJQllURSAqbGluZSA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHkpOwoJCQkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgRnJlZUltYWdlX0dldFdpZHRoKGRpYik7IHgrKykgewoJCQkJCXBpeGVsID0gKChXT1JEICopbGluZSlbeF07CgkJCQkJU3dhcFNob3J0KCZwaXhlbCk7CgkJCQkJaWYgKGlvLT53cml0ZV9wcm9jKCZwaXhlbCwgc2l6ZW9mKFdPUkQpLCAxLCBoYW5kbGUpICE9IDEpCgkJCQkJCXJldHVybiBGQUxTRTsKCQkJCX0KCQkJCWlmKHBhZGRpbmcgIT0gMCkgewoJCQkJCWlmKGlvLT53cml0ZV9wcm9jKCZwYWQsIHBhZGRpbmcsIDEsIGhhbmRsZSkgIT0gMSkgewoJCQkJCQlyZXR1cm4gRkFMU0U7CQkJCQoJCQkJCX0KCQkJCX0KCQkJfQojZW5kaWYKI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX1JHQgoJCX0gZWxzZSBpZiAoYnBwID09IDI0KSB7CgkJCWludCBwYWRkaW5nID0gRnJlZUltYWdlX0dldFBpdGNoKGRpYikgLSBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKSAqIHNpemVvZihGSUxFX0JHUik7CgkJCURXT1JEIHBhZCA9IDA7CgkJCUZJTEVfQkdSIGJncjsKCQkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgRnJlZUltYWdlX0dldEhlaWdodChkaWIpOyB5KyspIHsKCQkJCUJZVEUgKmxpbmUgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZGliLCB5KTsKCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOyB4KyspIHsKCQkJCQlSR0JUUklQTEUgKnRyaXBsZSA9ICgoUkdCVFJJUExFICopbGluZSkreDsKCQkJCQliZ3IuYiA9IHRyaXBsZS0+cmdidEJsdWU7CgkJCQkJYmdyLmcgPSB0cmlwbGUtPnJnYnRHcmVlbjsKCQkJCQliZ3IuciA9IHRyaXBsZS0+cmdidFJlZDsKCQkJCQlpZiAoaW8tPndyaXRlX3Byb2MoJmJnciwgc2l6ZW9mKEZJTEVfQkdSKSwgMSwgaGFuZGxlKSAhPSAxKQoJCQkJCQlyZXR1cm4gRkFMU0U7CgkJCQl9CgkJCQlpZihwYWRkaW5nICE9IDApIHsKCQkJCQlpZihpby0+d3JpdGVfcHJvYygmcGFkLCBwYWRkaW5nLCAxLCBoYW5kbGUpICE9IDEpIHsKCQkJCQkJcmV0dXJuIEZBTFNFOwkJCQkJCgkJCQkJfQoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmIChicHAgPT0gMzIpIHsKCQkJRklMRV9CR1JBIGJncmE7CgkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsgeSsrKSB7CgkJCQlCWVRFICpsaW5lID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgeSk7CgkJCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCBGcmVlSW1hZ2VfR2V0V2lkdGgoZGliKTsgeCsrKSB7CgkJCQkJUkdCUVVBRCAqcXVhZCA9ICgoUkdCUVVBRCAqKWxpbmUpK3g7CgkJCQkJYmdyYS5iID0gcXVhZC0+cmdiQmx1ZTsKCQkJCQliZ3JhLmcgPSBxdWFkLT5yZ2JHcmVlbjsKCQkJCQliZ3JhLnIgPSBxdWFkLT5yZ2JSZWQ7CgkJCQkJYmdyYS5hID0gcXVhZC0+cmdiUmVzZXJ2ZWQ7CgkJCQkJaWYgKGlvLT53cml0ZV9wcm9jKCZiZ3JhLCBzaXplb2YoRklMRV9CR1JBKSwgMSwgaGFuZGxlKSAhPSAxKQoJCQkJCQlyZXR1cm4gRkFMU0U7CgkJCQl9CgkJCX0KI2VuZGlmCgkJfSBlbHNlIGlmIChpby0+d3JpdGVfcHJvYyhGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpLCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYikgKiBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKSwgMSwgaGFuZGxlKSAhPSAxKSB7CgkJCXJldHVybiBGQUxTRTsKCQl9CgoJCXJldHVybiBUUlVFOwoJfSBlbHNlIHsKCQlyZXR1cm4gRkFMU0U7Cgl9Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gICBJbml0Ci8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnZvaWQgRExMX0NBTExDT05WCkluaXRCTVAoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKCXNfZm9ybWF0X2lkID0gZm9ybWF0X2lkOwoKCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CglwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CglwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CglwbHVnaW4tPm9wZW5fcHJvYyA9IE5VTEw7CglwbHVnaW4tPmNsb3NlX3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CglwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOwoJcGx1Z2luLT5zYXZlX3Byb2MgPSBTYXZlOwoJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gVmFsaWRhdGU7CglwbHVnaW4tPm1pbWVfcHJvYyA9IE1pbWVUeXBlOwoJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfYnBwX3Byb2MgPSBTdXBwb3J0c0V4cG9ydERlcHRoOwoJcGx1Z2luLT5zdXBwb3J0c19leHBvcnRfdHlwZV9wcm9jID0gU3VwcG9ydHNFeHBvcnRUeXBlOwoJcGx1Z2luLT5zdXBwb3J0c19pY2NfcHJvZmlsZXNfcHJvYyA9IE5VTEw7CS8vIG5vdCBpbXBsZW1lbnRlZCB5ZXQ7CglwbHVnaW4tPnN1cHBvcnRzX25vX3BpeGVsc19wcm9jID0gU3VwcG9ydHNOb1BpeGVsczsKfQo=