Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBCaXRtYXAgY29udmVyc2lvbiByb3V0aW5lcwovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gRmxvcmlzIHZhbiBkZW4gQmVyZyAoZmx2ZGJlcmdAd3hzLm5sKQovLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCi8vIC0gSmFuaSBLYWphbGEgKGphbmlrQHJlbWVkeS5maSkKLy8gLSBLYXJsLUhlaW56IEJ1c3NpYW4gKGtoYnVzc2lhbkBtb3NzLmRlKQovLyAtIENhcnN0ZW4gS2xlaW4gKGNrbGVpbjA1QHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKLy8KLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKLy8KLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCi8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCi8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQovLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAovLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCi8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCi8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgovLyBUSElTIERJU0NMQUlNRVIuCi8vCi8vIFVzZSBhdCB5b3VyIG93biByaXNrIQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5jbHVkZSAiRnJlZUltYWdlLmgiCiNpbmNsdWRlICJVdGlsaXRpZXMuaCIKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gIGludGVybmFsIGNvbnZlcnNpb25zIFggdG8gOCBiaXRzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgRExMX0NBTExDT05WCkZyZWVJbWFnZV9Db252ZXJ0TGluZTFUbzgoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKCWZvciAodW5zaWduZWQgY29scyA9IDA7IGNvbHMgPCAodW5zaWduZWQpd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspCgkJdGFyZ2V0W2NvbHNdID0gKHNvdXJjZVtjb2xzID4+IDNdICYgKDB4ODAgPj4gKGNvbHMgJiAweDA3KSkpICE9IDAgPyAyNTUgOiAwOwkKfQoKdm9pZCBETExfQ0FMTENPTlYKRnJlZUltYWdlX0NvbnZlcnRMaW5lNFRvOChCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscykgewoJdW5zaWduZWQgY291bnRfbmV3ID0gMDsKCXVuc2lnbmVkIGNvdW50X29yZyA9IDA7CglCT09MIGhpbmliYmxlID0gVFJVRTsKCgl3aGlsZSAoY291bnRfbmV3IDwgKHVuc2lnbmVkKXdpZHRoX2luX3BpeGVscykgewoJCWlmIChoaW5pYmJsZSkgewoJCQl0YXJnZXRbY291bnRfbmV3XSA9IChzb3VyY2VbY291bnRfb3JnXSA+PiA0KTsKCQl9IGVsc2UgewoJCQl0YXJnZXRbY291bnRfbmV3XSA9IChzb3VyY2VbY291bnRfb3JnXSAmIDB4MEYpOwoJCQljb3VudF9vcmcrKzsKCQl9CgkJaGluaWJibGUgPSAhaGluaWJibGU7CgkJY291bnRfbmV3Kys7Cgl9Cn0KCnZvaWQgRExMX0NBTExDT05WCkZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG84XzU1NShCWVRFICp0YXJnZXQsIEJZVEUgKnNvdXJjZSwgaW50IHdpZHRoX2luX3BpeGVscykgewoJY29uc3QgV09SRCAqY29uc3QgYml0cyA9IChXT1JEICopc291cmNlOwoJZm9yICh1bnNpZ25lZCBjb2xzID0gMDsgY29scyA8ICh1bnNpZ25lZCl3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgewoJCXRhcmdldFtjb2xzXSA9IEdSRVkoKCgoYml0c1tjb2xzXSAmIEZJMTZfNTU1X1JFRF9NQVNLKSA+PiBGSTE2XzU1NV9SRURfU0hJRlQpICogMHhGRikgLyAweDFGLAoJCQkgICAgICAgICAgICAgICAgKCgoYml0c1tjb2xzXSAmIEZJMTZfNTU1X0dSRUVOX01BU0spID4+IEZJMTZfNTU1X0dSRUVOX1NISUZUKSAqIDB4RkYpIC8gMHgxRiwKCQkJCQkJCSgoKGJpdHNbY29sc10gJiBGSTE2XzU1NV9CTFVFX01BU0spID4+IEZJMTZfNTU1X0JMVUVfU0hJRlQpICogMHhGRikgLyAweDFGKTsKCX0KfQoKdm9pZCBETExfQ0FMTENPTlYKRnJlZUltYWdlX0NvbnZlcnRMaW5lMTZUbzhfNTY1KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKSB7Cgljb25zdCBXT1JEICpjb25zdCBiaXRzID0gKFdPUkQgKilzb3VyY2U7Cglmb3IgKHVuc2lnbmVkIGNvbHMgPSAwOyBjb2xzIDwgKHVuc2lnbmVkKXdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CgkJdGFyZ2V0W2NvbHNdID0gR1JFWSgoKChiaXRzW2NvbHNdICYgRkkxNl81NjVfUkVEX01BU0spID4+IEZJMTZfNTY1X1JFRF9TSElGVCkgKiAweEZGKSAvIDB4MUYsCgkJCSAgICAgICAgKCgoYml0c1tjb2xzXSAmIEZJMTZfNTY1X0dSRUVOX01BU0spID4+IEZJMTZfNTY1X0dSRUVOX1NISUZUKSAqIDB4RkYpIC8gMHgzRiwKCQkJCQkoKChiaXRzW2NvbHNdICYgRkkxNl81NjVfQkxVRV9NQVNLKSA+PiBGSTE2XzU2NV9CTFVFX1NISUZUKSAqIDB4RkYpIC8gMHgxRik7Cgl9Cn0KCnZvaWQgRExMX0NBTExDT05WCkZyZWVJbWFnZV9Db252ZXJ0TGluZTI0VG84KEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBpbnQgd2lkdGhfaW5fcGl4ZWxzKSB7Cglmb3IgKHVuc2lnbmVkIGNvbHMgPSAwOyBjb2xzIDwgKHVuc2lnbmVkKXdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CgkJdGFyZ2V0W2NvbHNdID0gR1JFWShzb3VyY2VbRklfUkdCQV9SRURdLCBzb3VyY2VbRklfUkdCQV9HUkVFTl0sIHNvdXJjZVtGSV9SR0JBX0JMVUVdKTsKCQlzb3VyY2UgKz0gMzsKCX0KfQoKdm9pZCBETExfQ0FMTENPTlYKRnJlZUltYWdlX0NvbnZlcnRMaW5lMzJUbzgoQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKCWZvciAodW5zaWduZWQgY29scyA9IDA7IGNvbHMgPCAodW5zaWduZWQpd2lkdGhfaW5fcGl4ZWxzOyBjb2xzKyspIHsKCQl0YXJnZXRbY29sc10gPSBHUkVZKHNvdXJjZVtGSV9SR0JBX1JFRF0sIHNvdXJjZVtGSV9SR0JBX0dSRUVOXSwgc291cmNlW0ZJX1JHQkFfQkxVRV0pOwoJCXNvdXJjZSArPSA0OwoJfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgc21hcnQgY29udmVydCBYIHRvIDggYml0cwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfQ29udmVydFRvOEJpdHMoRklCSVRNQVAgKmRpYikgewoJaWYgKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKGRpYikpIHsKCQlyZXR1cm4gTlVMTDsKCX0KCgljb25zdCBGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoZGliKTsKCWlmIChpbWFnZV90eXBlICE9IEZJVF9CSVRNQVAgJiYgaW1hZ2VfdHlwZSAhPSBGSVRfVUlOVDE2KSB7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJY29uc3QgdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOwoKCWlmIChicHAgIT0gOCkgewoKCQljb25zdCB1bnNpZ25lZCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOwoJCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKCgkJLy8gQWxsb2NhdGUgYSBkZXN0aW5hdGlvbiBpbWFnZQoJCUZJQklUTUFQICpuZXdfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIDgpOwoJCWlmIChuZXdfZGliID09IE5VTEwpIHsKCQkJcmV0dXJuIE5VTEw7CgkJfQoKCQkvLyBDb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAoJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKG5ld19kaWIsIGRpYik7CgoJCS8vIFBhbGV0dGUgb2YgZGVzdGluYXRpb24gaW1hZ2UgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZAoJCVJHQlFVQUQgKm5ld19wYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShuZXdfZGliKTsKCgkJY29uc3QgRlJFRV9JTUFHRV9DT0xPUl9UWVBFIGNvbG9yX3R5cGUgPSBGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKGRpYik7CgoJCWlmIChpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKCgkJCXN3aXRjaChicHApIHsKCQkJCWNhc2UgMToKCQkJCXsKCQkJCQlpZiAoY29sb3JfdHlwZSA9PSBGSUNfUEFMRVRURSkgewoJCQkJCQkvLyBDb3B5IHRoZSBwYWxldHRlCgkJCQkJCVJHQlFVQUQgKm9sZF9wYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOwoJCQkJCQluZXdfcGFsWzBdID0gb2xkX3BhbFswXTsKCQkJCQkJbmV3X3BhbFsyNTVdID0gb2xkX3BhbFsxXTsKCgkJCQkJfSBlbHNlIGlmIChjb2xvcl90eXBlID09IEZJQ19NSU5JU1dISVRFKSB7CgkJCQkJCS8vIENyZWF0ZSBhIHJldmVyc2UgZ3JheXNjYWxlIHBhbGV0dGUKCQkJCQkJQ1JFQVRFX0dSRVlTQ0FMRV9QQUxFVFRFX1JFVkVSU0UobmV3X3BhbCwgMjU2KTsKCQkJCQl9CgoJCQkJCS8vIEV4cGFuZCBhbmQgY29weSB0aGUgYml0bWFwIGRhdGEKCQkJCQlmb3IgKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKCQkJCQkJRnJlZUltYWdlX0NvbnZlcnRMaW5lMVRvOChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CgkJCQkJfQoJCQkJCXJldHVybiBuZXdfZGliOwoJCQkJfQoKCQkJCWNhc2UgNCA6CgkJCQl7CgkJCQkJaWYgKGNvbG9yX3R5cGUgPT0gRklDX1BBTEVUVEUpIHsKCQkJCQkJLy8gQ29weSB0aGUgcGFsZXR0ZQoJCQkJCQltZW1jcHkobmV3X3BhbCwgRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKSwgMTYgKiBzaXplb2YoUkdCUVVBRCkpOwoJCQkJCX0KCgkJCQkJLy8gRXhwYW5kIGFuZCBjb3B5IHRoZSBiaXRtYXAgZGF0YQoJCQkJCWZvciAodW5zaWduZWQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgewoJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmU0VG84KEZyZWVJbWFnZV9HZXRTY2FuTGluZShuZXdfZGliLCByb3dzKSwgRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgcm93cyksIHdpZHRoKTsJCQkJCQoJCQkJCX0KCQkJCQlyZXR1cm4gbmV3X2RpYjsKCQkJCX0KCgkJCQljYXNlIDE2IDoKCQkJCXsKCQkJCQkvLyBFeHBhbmQgYW5kIGNvcHkgdGhlIGJpdG1hcCBkYXRhCgkJCQkJaWYgKElTX0ZPUk1BVF9SR0I1NjUoZGliKSkgewoJCQkJCQlmb3IgKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKCQkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG84XzU2NShGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlmb3IgKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKCQkJCQkJCUZyZWVJbWFnZV9Db252ZXJ0TGluZTE2VG84XzU1NShGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJcmV0dXJuIG5ld19kaWI7CgkJCQl9CgoJCQkJY2FzZSAyNCA6CgkJCQl7CgkJCQkJLy8gRXhwYW5kIGFuZCBjb3B5IHRoZSBiaXRtYXAgZGF0YQoJCQkJCWZvciAodW5zaWduZWQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgewoJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUyNFRvOChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CQkJCQkKCQkJCQl9CgkJCQkJcmV0dXJuIG5ld19kaWI7CgkJCQl9CgoJCQkJY2FzZSAzMiA6CgkJCQl7CgkJCQkJLy8gRXhwYW5kIGFuZCBjb3B5IHRoZSBiaXRtYXAgZGF0YQoJCQkJCWZvciAodW5zaWduZWQgcm93cyA9IDA7IHJvd3MgPCBoZWlnaHQ7IHJvd3MrKykgewoJCQkJCQlGcmVlSW1hZ2VfQ29udmVydExpbmUzMlRvOChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUobmV3X2RpYiwgcm93cyksIEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIHJvd3MpLCB3aWR0aCk7CgkJCQkJfQoJCQkJCXJldHVybiBuZXdfZGliOwoJCQkJfQoJCQl9CgoJCX0gZWxzZSBpZiAoaW1hZ2VfdHlwZSA9PSBGSVRfVUlOVDE2KSB7CgoJCQljb25zdCB1bnNpZ25lZCBzcmNfcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKCQkJY29uc3QgdW5zaWduZWQgZHN0X3BpdGNoID0gRnJlZUltYWdlX0dldFBpdGNoKG5ld19kaWIpOwoJCQljb25zdCBCWVRFICpzcmNfYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CgkJCUJZVEUgKmRzdF9iaXRzID0gRnJlZUltYWdlX0dldEJpdHMobmV3X2RpYik7CgoJCQlmb3IgKHVuc2lnbmVkIHJvd3MgPSAwOyByb3dzIDwgaGVpZ2h0OyByb3dzKyspIHsKCQkJCWNvbnN0IFdPUkQgKmNvbnN0IHNyY19waXhlbCA9IChXT1JEKilzcmNfYml0czsKCQkJCUJZVEUgKmRzdF9waXhlbCA9IChCWVRFKilkc3RfYml0czsKCQkJCWZvcih1bnNpZ25lZCBjb2xzID0gMDsgY29scyA8IHdpZHRoOyBjb2xzKyspIHsKCQkJCQlkc3RfcGl4ZWxbY29sc10gPSAoQllURSkoc3JjX3BpeGVsW2NvbHNdID4+IDgpOwoJCQkJfQoJCQkJc3JjX2JpdHMgKz0gc3JjX3BpdGNoOwoJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOwoJCQl9CgkJCXJldHVybiBuZXdfZGliOwoJCX0gCgoJfSAvLyBicHAgIT0gOAoKCXJldHVybiBGcmVlSW1hZ2VfQ2xvbmUoZGliKTsKfQoKRklCSVRNQVAgKiBETExfQ0FMTENPTlYKRnJlZUltYWdlX0NvbnZlcnRUb0dyZXlzY2FsZShGSUJJVE1BUCAqZGliKSB7CglpZiAoIUZyZWVJbWFnZV9IYXNQaXhlbHMoZGliKSkgewoJCXJldHVybiBOVUxMOwoJfQoKCWNvbnN0IEZSRUVfSU1BR0VfQ09MT1JfVFlQRSBjb2xvcl90eXBlID0gRnJlZUltYWdlX0dldENvbG9yVHlwZShkaWIpOwoKCWlmIChjb2xvcl90eXBlID09IEZJQ19QQUxFVFRFIHx8IGNvbG9yX3R5cGUgPT0gRklDX01JTklTV0hJVEUpIHsKCgkJY29uc3QgdW5zaWduZWQgYnBwID0gRnJlZUltYWdlX0dldEJQUChkaWIpOwoJCWNvbnN0IHVuc2lnbmVkIHdpZHRoICA9IEZyZWVJbWFnZV9HZXRXaWR0aChkaWIpOwoJCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKTsKCgkJRklCSVRNQVAgKm5ld19kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgOCk7CgkJaWYgKG5ld19kaWIgPT0gTlVMTCkgewoJCQlyZXR1cm4gTlVMTDsKCQl9CgoJCS8vIENvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CgkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEobmV3X2RpYiwgZGliKTsKCgkJLy8gQ3JlYXRlIGEgZ3JleXNjYWxlIHBhbGV0dGUKCQlCWVRFIGdyZXlfcGFsWzI1Nl07CgkJY29uc3QgUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKCQljb25zdCB1bnNpZ25lZCBzaXplID0gQ2FsY3VsYXRlVXNlZFBhbGV0dGVFbnRyaWVzKGJwcCk7CgkJZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQlncmV5X3BhbFtpXSA9IEdSRVkocGFsLT5yZ2JSZWQsIHBhbC0+cmdiR3JlZW4sIHBhbC0+cmdiQmx1ZSk7CgkJCXBhbCsrOwoJCX0KCgkJY29uc3QgQllURSAqc3JjX2JpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpOwoJCUJZVEUgKmRzdF9iaXRzID0gRnJlZUltYWdlX0dldEJpdHMobmV3X2RpYik7CgoJCWNvbnN0IHVuc2lnbmVkIHNyY19waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOwoJCWNvbnN0IHVuc2lnbmVkIGRzdF9waXRjaCA9IEZyZWVJbWFnZV9HZXRQaXRjaChuZXdfZGliKTsKCgkJc3dpdGNoKGJwcCkgewoJCQljYXNlIDE6CgkJCXsKCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCQkJCWNvbnN0IHVuc2lnbmVkIHBpeGVsID0gKHNyY19iaXRzW3ggPj4gM10gJiAoMHg4MCA+PiAoeCAmIDB4MDcpKSkgIT0gMDsKCQkJCQkJZHN0X2JpdHNbeF0gPSBncmV5X3BhbFtwaXhlbF07CgkJCQkJfQoJCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKCQkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CgkJCQl9CgkJCX0KCQkJYnJlYWs7CgoJCQljYXNlIDQ6CgkJCXsKCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCQkJCWNvbnN0IHVuc2lnbmVkIHBpeGVsID0geCAmIDB4MDEgPyBzcmNfYml0c1t4ID4+IDFdICYgMHgwRiA6IHNyY19iaXRzW3ggPj4gMV0gPj4gNDsKCQkJCQkJZHN0X2JpdHNbeF0gPSBncmV5X3BhbFtwaXhlbF07CgkJCQkJfQoJCQkJCXNyY19iaXRzICs9IHNyY19waXRjaDsKCQkJCQlkc3RfYml0cyArPSBkc3RfcGl0Y2g7CgkJCQl9CgkJCX0KCQkJYnJlYWs7CgoJCQljYXNlIDg6CgkJCXsKCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCQkJCWRzdF9iaXRzW3hdID0gZ3JleV9wYWxbc3JjX2JpdHNbeF1dOwoJCQkJCX0KCQkJCQlzcmNfYml0cyArPSBzcmNfcGl0Y2g7CgkJCQkJZHN0X2JpdHMgKz0gZHN0X3BpdGNoOwoJCQkJfQoJCQl9CgkJCWJyZWFrOwoJCX0KCQlyZXR1cm4gbmV3X2RpYjsKCX0gCgkKCS8vIENvbnZlcnQgdGhlIGJpdG1hcCB0byA4LWJpdCBncmV5c2NhbGUKCXJldHVybiBGcmVlSW1hZ2VfQ29udmVydFRvOEJpdHMoZGliKTsKfQo=