LyoKICogVXNlciBJbnRlcmZhY2UgRnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAxOTk3IERpbWl0cmllIE8uIFBhdW4KICogQ29weXJpZ2h0IDE5OTcgQmVydGhvIEEuIFN0dWx0aWVucwogKi8KCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgojaW5jbHVkZSAidHdlYWsuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChncmFwaGljcykKCnN0YXRpYyBjb25zdCBXT1JEIHdQYXR0ZXJuX0FBNTVbOF0gPSB7IDB4YWFhYSwgMHg1NTU1LCAweGFhYWEsIDB4NTU1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYWFhLCAweDU1NTUsIDB4YWFhYSwgMHg1NTU1IH07CgovKiBUaGVzZSB0YWJsZXMgYXJlIHVzZWQgaW46CiAqIFVJVE9PTFNfRHJhd0RpYWdFZGdlKCkKICogVUlUT09MU19EcmF3UmVjdEVkZ2UoKQogKi8Kc3RhdGljIGNvbnN0IGNoYXIgTFRJbm5lck5vcm1hbFtdID0gewogICAgLTEsICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgLTEsCiAgICAtMSwgICAgICAgICAgIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfQlROSElHSExJR0hULCAtMSwKICAgIC0xLCAgICAgICAgICAgQ09MT1JfM0RES1NIQURPVywgICBDT0xPUl8zRERLU0hBRE9XLCAgIC0xLAogICAgLTEsICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgLTEKfTsKCnN0YXRpYyBjb25zdCBjaGFyIExUT3V0ZXJOb3JtYWxbXSA9IHsKICAgIC0xLCAgICAgICAgICAgICAgICAgQ09MT1JfM0RMSUdIVCwgICAgIENPTE9SX0JUTlNIQURPVywgLTEsCiAgICBDT0xPUl9CVE5ISUdITElHSFQsIENPTE9SXzNETElHSFQsICAgICBDT0xPUl9CVE5TSEFET1csIC0xLAogICAgQ09MT1JfM0RES1NIQURPVywgICBDT0xPUl8zRExJR0hULCAgICAgQ09MT1JfQlROU0hBRE9XLCAtMSwKICAgIC0xLCAgICAgICAgICAgICAgICAgQ09MT1JfM0RMSUdIVCwgICAgIENPTE9SX0JUTlNIQURPVywgLTEKfTsKCnN0YXRpYyBjb25zdCBjaGFyIFJCSW5uZXJOb3JtYWxbXSA9IHsKICAgIC0xLCAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgLTEsCiAgICAtMSwgICAgICAgICAgIENPTE9SX0JUTlNIQURPVywgICBDT0xPUl9CVE5TSEFET1csIC0xLAogICAgLTEsICAgICAgICAgICBDT0xPUl8zRExJR0hULCAgICAgQ09MT1JfM0RMSUdIVCwgICAtMSwKICAgIC0xLCAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgLTEKfTsKCnN0YXRpYyBjb25zdCBjaGFyIFJCT3V0ZXJOb3JtYWxbXSA9IHsKICAgIC0xLCAgICAgICAgICAgICAgQ09MT1JfM0RES1NIQURPVywgIENPTE9SX0JUTkhJR0hMSUdIVCwgLTEsCiAgICBDT0xPUl9CVE5TSEFET1csIENPTE9SXzNEREtTSEFET1csICBDT0xPUl9CVE5ISUdITElHSFQsIC0xLAogICAgQ09MT1JfM0RMSUdIVCwgICBDT0xPUl8zRERLU0hBRE9XLCAgQ09MT1JfQlROSElHSExJR0hULCAtMSwKICAgIC0xLCAgICAgICAgICAgICAgQ09MT1JfM0RES1NIQURPVywgIENPTE9SX0JUTkhJR0hMSUdIVCwgLTEKfTsKCnN0YXRpYyBjb25zdCBjaGFyIExUSW5uZXJTb2Z0W10gPSB7CiAgICAtMSwgICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAtMSwKICAgIC0xLCAgICAgICAgICAgICAgICAgIENPTE9SXzNETElHSFQsICAgICBDT0xPUl8zRExJR0hULCAgIC0xLAogICAgLTEsICAgICAgICAgICAgICAgICAgQ09MT1JfQlROU0hBRE9XLCAgIENPTE9SX0JUTlNIQURPVywgLTEsCiAgICAtMSwgICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAtMQp9OwoKc3RhdGljIGNvbnN0IGNoYXIgTFRPdXRlclNvZnRbXSA9IHsKICAgIC0xLCAgICAgICAgICAgICAgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl8zRERLU0hBRE9XLCAtMSwKICAgIENPTE9SXzNETElHSFQsICAgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl8zRERLU0hBRE9XLCAtMSwKICAgIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl8zRERLU0hBRE9XLCAtMSwKICAgIC0xLCAgICAgICAgICAgICAgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl8zRERLU0hBRE9XLCAtMQp9OwoKI2RlZmluZSBSQklubmVyU29mdCBSQklubmVyTm9ybWFsICAgLyogVGhlc2UgYXJlIHRoZSBzYW1lICovCiNkZWZpbmUgUkJPdXRlclNvZnQgUkJPdXRlck5vcm1hbAoKc3RhdGljIGNvbnN0IGNoYXIgTFRSQk91dGVyTW9ub1tdID0gewogICAgLTEsICAgICAgICAgICBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAogICAgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAogICAgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAogICAgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAp9OwoKc3RhdGljIGNvbnN0IGNoYXIgTFRSQklubmVyTW9ub1tdID0gewogICAgLTEsIC0xLCAgICAgICAgICAgLTEsICAgICAgICAgICAtMSwKICAgIC0xLCBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XLAogICAgLTEsIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1csCiAgICAtMSwgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPVywKfTsKCnN0YXRpYyBjb25zdCBjaGFyIExUUkJPdXRlckZsYXRbXSA9IHsKICAgIC0xLCAgICAgICAgICAgICAgICBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROU0hBRE9XLAogICAgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csCiAgICBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywKICAgIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROU0hBRE9XLAp9OwoKc3RhdGljIGNvbnN0IGNoYXIgTFRSQklubmVyRmxhdFtdID0gewogICAgLTEsIC0xLCAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAtMSwKICAgIC0xLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAogICAgLTEsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsCiAgICAtMSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVUlUT09MU19EcmF3RGlhZ0VkZ2UKICoKICogU2FtZSBhcyBEcmF3RWRnZSBpbnZva2VkIHdpdGggQkZfRElBR09OQUwKICoKICogMDMtRGVjLTE5OTc6IENoYW5nZWQgYnkgQmVydGhvIFN0dWx0aWVucwogKgogKiBTZWUgYWxzbyBjb21tZW50cyB3aXRoIFVJVE9PTFNfRHJhd1JlY3RFZGdlKCkKICovCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9EcmF3RGlhZ0VkZ2UoSERDIGhkYywgTFBSRUNUIHJjLCAKCQkJCSAgICAgVUlOVCB1VHlwZSwgVUlOVCB1RmxhZ3MpCnsKICAgIFBPSU5UIFBvaW50c1s0XTsKICAgIGNoYXIgSW5uZXJJLCBPdXRlckk7CiAgICBIUEVOIElubmVyUGVuLCBPdXRlclBlbjsKICAgIFBPSU5UIFNhdmVQb2ludDsKICAgIEhQRU4gU2F2ZVBlbjsKICAgIGludCBzcHgsIHNweTsKICAgIGludCBlcHgsIGVweTsKICAgIGludCBXaWR0aCA9IHJjLT5yaWdodCAtIHJjLT5sZWZ0OwogICAgaW50IEhlaWdodD0gcmMtPmJvdHRvbSAtIHJjLT50b3A7CiAgICBpbnQgU21hbGxEaWFtID0gV2lkdGggPiBIZWlnaHQgPyBIZWlnaHQgOiBXaWR0aDsKICAgIEJPT0wgcmV0dmFsID0gISggICAoKHVUeXBlICYgQkRSX0lOTkVSKSA9PSBCRFJfSU5ORVIKICAgICAgICAgICAgICAgICAgICAgICB8fCAodVR5cGUgJiBCRFJfT1VURVIpID09IEJEUl9PVVRFUikKICAgICAgICAgICAgICAgICAgICAgICYmICEodUZsYWdzICYgKEJGX0ZMQVR8QkZfTU9OTykpICk7CiAgICBpbnQgYWRkID0gKExUUkJJbm5lck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildICE9IC0xID8gMSA6IDApCiAgICAgICAgICAgICsgKExUUkJPdXRlck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildICE9IC0xID8gMSA6IDApOwoKICAgIC8qIEluaXQgc29tZSB2YXJzICovCiAgICBPdXRlclBlbiA9IElubmVyUGVuID0gKEhQRU4pR2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pOwogICAgU2F2ZVBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChoZGMsIElubmVyUGVuKTsKICAgIHNweCA9IHNweSA9IGVweCA9IGVweSA9IDA7IC8qIFNhdGlzZnkgdGhlIGNvbXBpbGVyLi4uICovCiAgICAKICAgIC8qIERldGVybWluZSB0aGUgY29sb3JzIG9mIHRoZSBlZGdlcyAqLwogICAgaWYodUZsYWdzICYgQkZfTU9OTykKICAgIHsKICAgICAgICBJbm5lckkgPSBMVFJCSW5uZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBPdXRlckkgPSBMVFJCT3V0ZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgIH0KICAgIGVsc2UgaWYodUZsYWdzICYgQkZfRkxBVCkKICAgIHsKICAgICAgICBJbm5lckkgPSBMVFJCSW5uZXJGbGF0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBPdXRlckkgPSBMVFJCT3V0ZXJGbGF0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgIH0KICAgIGVsc2UgaWYodUZsYWdzICYgQkZfU09GVCkKICAgIHsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pCiAgICAgICAgewogICAgICAgICAgICBJbm5lckkgPSBSQklubmVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgICAgIE91dGVySSA9IFJCT3V0ZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgSW5uZXJJID0gTFRJbm5lclNvZnRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgICAgICBPdXRlckkgPSBMVE91dGVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmKHVGbGFncyAmIEJGX0JPVFRPTSkKICAgICAgICB7CiAgICAgICAgICAgIElubmVySSA9IFJCSW5uZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgICAgICBPdXRlckkgPSBSQk91dGVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgSW5uZXJJID0gTFRJbm5lck5vcm1hbFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgICAgIE91dGVySSA9IExUT3V0ZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIH0KICAgIH0KCiAgICBpZihJbm5lckkgIT0gLTEpIElubmVyUGVuID0gR2V0U3lzQ29sb3JQZW4oSW5uZXJJKTsKICAgIGlmKE91dGVySSAhPSAtMSkgT3V0ZXJQZW4gPSBHZXRTeXNDb2xvclBlbihPdXRlckkpOwoKICAgIE1vdmVUb0V4KGhkYywgMCwgMCwgJlNhdmVQb2ludCk7CgogICAgLyogRG9uJ3QgYXNrIG1lIHdoeSwgYnV0IHRoaXMgaXMgd2hhdCBpcyB2aXNpYmxlLi4uICovCiAgICAvKiBUaGlzIG11c3QgYmUgcG9zc2libGUgdG8gZG8gbXVjaCBzaW1wbGVyLCBidXQgSSBmYWlsIHRvICovCiAgICAvKiBzZWUgdGhlIGxvZ2ljIGluIHRoZSBNUyBpbXBsZW1lbnRhdGlvbiAoc2lnaC4uLikuICovCiAgICAvKiBTbywgdGhpcyBtaWdodCBsb29rIGEgYml0IGJydXRlIGZvcmNlIGhlcmUgKGFuZCBpdCBpcyksIGJ1dCAqLwogICAgLyogaXQgZ2V0cyB0aGUgam9iIGRvbmU7KSAqLwoKICAgIHN3aXRjaCh1RmxhZ3MgJiBCRl9SRUNUKQogICAgewogICAgY2FzZSAwOgogICAgY2FzZSBCRl9MRUZUOgogICAgY2FzZSBCRl9CT1RUT006CiAgICBjYXNlIEJGX0JPVFRPTUxFRlQ6CiAgICAgICAgLyogTGVmdCBib3R0b20gZW5kcG9pbnQgKi8KICAgICAgICBlcHggPSByYy0+bGVmdC0xOwogICAgICAgIHNweCA9IGVweCArIFNtYWxsRGlhbTsKICAgICAgICBlcHkgPSByYy0+Ym90dG9tOwogICAgICAgIHNweSA9IGVweSAtIFNtYWxsRGlhbTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEJGX1RPUExFRlQ6CiAgICBjYXNlIEJGX0JPVFRPTVJJR0hUOgogICAgICAgIC8qIExlZnQgdG9wIGVuZHBvaW50ICovCiAgICAgICAgZXB4ID0gcmMtPmxlZnQtMTsKICAgICAgICBzcHggPSBlcHggKyBTbWFsbERpYW07CiAgICAgICAgZXB5ID0gcmMtPnRvcC0xOwogICAgICAgIHNweSA9IGVweSArIFNtYWxsRGlhbTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEJGX1RPUDoKICAgIGNhc2UgQkZfUklHSFQ6CiAgICBjYXNlIEJGX1RPUFJJR0hUOgogICAgY2FzZSBCRl9SSUdIVHxCRl9MRUZUOgogICAgY2FzZSBCRl9SSUdIVHxCRl9MRUZUfEJGX1RPUDoKICAgIGNhc2UgQkZfQk9UVE9NfEJGX1RPUDoKICAgIGNhc2UgQkZfQk9UVE9NfEJGX1RPUHxCRl9MRUZUOgogICAgY2FzZSBCRl9CT1RUT01SSUdIVHxCRl9MRUZUOgogICAgY2FzZSBCRl9CT1RUT01SSUdIVHxCRl9UT1A6CiAgICBjYXNlIEJGX1JFQ1Q6CiAgICAgICAgLyogUmlnaHQgdG9wIGVuZHBvaW50ICovCiAgICAgICAgc3B4ID0gcmMtPmxlZnQ7CiAgICAgICAgZXB4ID0gc3B4ICsgU21hbGxEaWFtOwogICAgICAgIHNweSA9IHJjLT5ib3R0b20tMTsKICAgICAgICBlcHkgPSBzcHkgLSBTbWFsbERpYW07CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgTW92ZVRvRXgoaGRjLCBzcHgsIHNweSwgTlVMTCk7CiAgICBTZWxlY3RPYmplY3QoaGRjLCBPdXRlclBlbik7CiAgICBMaW5lVG8oaGRjLCBlcHgsIGVweSk7CgogICAgU2VsZWN0T2JqZWN0KGhkYywgSW5uZXJQZW4pOwoKICAgIHN3aXRjaCh1RmxhZ3MgJiAoQkZfUkVDVHxCRl9ESUFHT05BTCkpCiAgICB7CiAgICBjYXNlIEJGX0RJQUdPTkFMX0VOREJPVFRPTUxFRlQ6CiAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9CT1RUT00pOgogICAgY2FzZSBCRl9ESUFHT05BTDoKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX0xFRlQpOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4LTEsIHNweSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4LCBlcHktMSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBzcHgtYWRkOwogICAgICAgIFBvaW50c1swXS55ID0gc3B5OwogICAgICAgIFBvaW50c1sxXS54ID0gcmMtPmxlZnQ7CiAgICAgICAgUG9pbnRzWzFdLnkgPSByYy0+dG9wOwogICAgICAgIFBvaW50c1syXS54ID0gZXB4KzE7CiAgICAgICAgUG9pbnRzWzJdLnkgPSBlcHktMS1hZGQ7CiAgICAgICAgUG9pbnRzWzNdID0gUG9pbnRzWzJdOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQkZfRElBR09OQUxfRU5EQk9UVE9NUklHSFQ6CiAgICAgICAgTW92ZVRvRXgoaGRjLCBzcHgtMSwgc3B5LCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBlcHgsIGVweSsxKTsKICAgICAgICBQb2ludHNbMF0ueCA9IHNweC1hZGQ7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBzcHk7CiAgICAgICAgUG9pbnRzWzFdLnggPSByYy0+bGVmdDsKICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT5ib3R0b20tMTsKICAgICAgICBQb2ludHNbMl0ueCA9IGVweCsxOwogICAgICAgIFBvaW50c1syXS55ID0gZXB5KzErYWRkOwogICAgICAgIFBvaW50c1szXSA9IFBvaW50c1syXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9CT1RUT018QkZfUklHSFR8QkZfVE9QKToKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX0JPVFRPTXxCRl9SSUdIVHxCRl9UT1B8QkZfTEVGVCk6CiAgICBjYXNlIEJGX0RJQUdPTkFMX0VORFRPUFJJR0hUOgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfUklHSFR8QkZfVE9QfEJGX0xFRlQpOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4KzEsIHNweSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4LCBlcHkrMSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBlcHgtMTsKICAgICAgICBQb2ludHNbMF0ueSA9IGVweSsxK2FkZDsKICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcCthZGQ7CiAgICAgICAgUG9pbnRzWzJdLnggPSByYy0+cmlnaHQtMTsKICAgICAgICBQb2ludHNbMl0ueSA9IHJjLT5ib3R0b20tMTsKICAgICAgICBQb2ludHNbM10ueCA9IHNweCthZGQ7CiAgICAgICAgUG9pbnRzWzNdLnkgPSBzcHk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBCRl9ESUFHT05BTF9FTkRUT1BMRUZUOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4LCBzcHktMSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4KzEsIGVweSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBlcHgrMSthZGQ7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBlcHkrMTsKICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcDsKICAgICAgICBQb2ludHNbMl0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1syXS55ID0gcmMtPmJvdHRvbS0xLWFkZDsKICAgICAgICBQb2ludHNbM10ueCA9IHNweDsKICAgICAgICBQb2ludHNbM10ueSA9IHNweS1hZGQ7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfVE9QKToKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX0JPVFRPTXxCRl9UT1ApOgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfQk9UVE9NfEJGX1RPUHxCRl9MRUZUKToKICAgICAgICBNb3ZlVG9FeChoZGMsIHNweCsxLCBzcHktMSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4LCBlcHkpOwogICAgICAgIFBvaW50c1swXS54ID0gZXB4LTE7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBlcHkrMTsKICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcDsKICAgICAgICBQb2ludHNbMl0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1syXS55ID0gcmMtPmJvdHRvbS0xLWFkZDsKICAgICAgICBQb2ludHNbM10ueCA9IHNweCthZGQ7CiAgICAgICAgUG9pbnRzWzNdLnkgPSBzcHktYWRkOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1JJR0hUKToKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1JJR0hUfEJGX0xFRlQpOgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfUklHSFR8QkZfTEVGVHxCRl9CT1RUT00pOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4LCBzcHksIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIGVweC0xLCBlcHkrMSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBzcHg7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBzcHk7CiAgICAgICAgUG9pbnRzWzFdLnggPSByYy0+bGVmdDsKICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT50b3ArYWRkOwogICAgICAgIFBvaW50c1syXS54ID0gZXB4LTEtYWRkOwogICAgICAgIFBvaW50c1syXS55ID0gZXB5KzErYWRkOwogICAgICAgIFBvaW50c1szXSA9IFBvaW50c1syXTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICAvKiBGaWxsIHRoZSBpbnRlcmlvciBpZiBhc2tlZCAqLwogICAgaWYoKHVGbGFncyAmIEJGX01JRERMRSkgJiYgcmV0dmFsKQogICAgewogICAgICAgIEhCUlVTSCBoYnNhdmU7CiAgICAgICAgSEJSVVNIIGhiID0gR2V0U3lzQ29sb3JCcnVzaCh1RmxhZ3MgJiBCRl9NT05PID8gQ09MT1JfV0lORE9XCgkJCQkJIDpDT0xPUl9CVE5GQUNFKTsKICAgICAgICBIUEVOIGhwc2F2ZTsKICAgICAgICBIUEVOIGhwID0gR2V0U3lzQ29sb3JQZW4odUZsYWdzICYgQkZfTU9OTyA/IENPTE9SX1dJTkRPVwoJCQkJICAgICA6IENPTE9SX0JUTkZBQ0UpOwogICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGhkYywgaGIpOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChoZGMsIGhwKTsKICAgICAgICBQb2x5Z29uKGhkYywgUG9pbnRzLCA0KTsKICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBoYnNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChoZGMsIGhwc2F2ZSk7CiAgICB9CgogICAgLyogQWRqdXN0IHJlY3RhbmdsZSBpZiBhc2tlZCAqLwogICAgaWYodUZsYWdzICYgQkZfQURKVVNUKQogICAgewogICAgICAgIGlmKHVGbGFncyAmIEJGX0xFRlQpICAgcmMtPmxlZnQgICArPSBhZGQ7CiAgICAgICAgaWYodUZsYWdzICYgQkZfUklHSFQpICByYy0+cmlnaHQgIC09IGFkZDsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9UT1ApICAgIHJjLT50b3AgICAgKz0gYWRkOwogICAgICAgIGlmKHVGbGFncyAmIEJGX0JPVFRPTSkgcmMtPmJvdHRvbSAtPSBhZGQ7CiAgICB9CgogICAgLyogQ2xlYW51cCAqLwogICAgU2VsZWN0T2JqZWN0KGhkYywgU2F2ZVBlbik7CiAgICBNb3ZlVG9FeChoZGMsIFNhdmVQb2ludC54LCBTYXZlUG9pbnQueSwgTlVMTCk7CgogICAgcmV0dXJuIHJldHZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBVSVRPT0xTX0RyYXdSZWN0RWRnZQogKgogKiBTYW1lIGFzIERyYXdFZGdlIGludm9rZWQgd2l0aG91dCBCRl9ESUFHT05BTAogKgogKiAyMy1Ob3YtMTk5NzogQ2hhbmdlZCBieSBCZXJ0aG8gU3R1bHRpZW5zCiAqCiAqIFdlbGwsIEkgc3RhcnRlZCB0ZXN0aW5nIHRoaXMgYW5kIGZvdW5kIG91dCB0aGF0IHRoZXJlIGFyZSBhIGZldyB0aGluZ3MKICogdGhhdCB3ZXJlbid0IHF1aXRlIGFzIHdpbjk1LiBUaGUgZm9sbG93aW5nIHJld3JpdGUgc2hvdWxkIHJlcHJvZHVjZQogKiB3aW45NSByZXN1bHRzIGNvbXBsZXRlbHkuCiAqIFRoZSBjb2xvcnNlbGVjdGlvbiBpcyB0YWJsZS1kcml2ZW4gdG8gYXZvaWQgYXdmdWxsIGlmLXN0YXRlbWVudHMuCiAqIFRoZSB0YWJsZSBiZWxvdyBzaG93IHRoZSBjb2xvciBzZXR0aW5ncy4KICoKICogUGVuIHNlbGVjdGlvbiB0YWJsZSBmb3IgdUZsYWdzID0gMAogKgogKiB1VHlwZSB8ICBMVEkgIHwgIExUTyAgfCAgUkJJICB8ICBSQk8KICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAwMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDAwMDEgfCAgIHggICB8ICAyMiAgIHwgICB4ICAgfCAgMjEKICogIDAwMTAgfCAgIHggICB8ICAxNiAgIHwgICB4ICAgfCAgMjAKICogIDAwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAxMDAgfCAgIHggICB8ICAyMCAgIHwgICB4ICAgfCAgMTYKICogIDAxMDEgfCAgMjAgICB8ICAyMiAgIHwgIDE2ICAgfCAgMjEKICogIDAxMTAgfCAgMjAgICB8ICAxNiAgIHwgIDE2ICAgfCAgMjAKICogIDAxMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDEwMDAgfCAgIHggICB8ICAyMSAgIHwgICB4ICAgfCAgMjIKICogIDEwMDEgfCAgMjEgICB8ICAyMiAgIHwgIDIyICAgfCAgMjEKICogIDEwMTAgfCAgMjEgICB8ICAxNiAgIHwgIDIyICAgfCAgMjAKICogIDEwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDExMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDExMDEgfCAgIHggICB8IHggKDIyKXwgICB4ICAgfCB4ICgyMSkKICogIDExMTAgfCAgIHggICB8IHggKDE2KXwgICB4ICAgfCB4ICgyMCkKICogIDExMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICoKICogUGVuIHNlbGVjdGlvbiB0YWJsZSBmb3IgdUZsYWdzID0gQkZfU09GVAogKgogKiB1VHlwZSB8ICBMVEkgIHwgIExUTyAgfCAgUkJJICB8ICBSQk8KICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAwMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDAwMDEgfCAgIHggICB8ICAyMCAgIHwgICB4ICAgfCAgMjEKICogIDAwMTAgfCAgIHggICB8ICAyMSAgIHwgICB4ICAgfCAgMjAKICogIDAwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAxMDAgfCAgIHggICB8ICAyMiAgIHwgICB4ICAgfCAgMTYKICogIDAxMDEgfCAgMjIgICB8ICAyMCAgIHwgIDE2ICAgfCAgMjEKICogIDAxMTAgfCAgMjIgICB8ICAyMSAgIHwgIDE2ICAgfCAgMjAKICogIDAxMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDEwMDAgfCAgIHggICB8ICAxNiAgIHwgICB4ICAgfCAgMjIKICogIDEwMDEgfCAgMTYgICB8ICAyMCAgIHwgIDIyICAgfCAgMjEKICogIDEwMTAgfCAgMTYgICB8ICAyMSAgIHwgIDIyICAgfCAgMjAKICogIDEwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDExMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDExMDEgfCAgIHggICB8IHggKDIwKXwgICB4ICAgfCB4ICgyMSkKICogIDExMTAgfCAgIHggICB8IHggKDIxKXwgICB4ICAgfCB4ICgyMCkKICogIDExMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICoKICogeCA9IGRvbid0IGNhcmU7IChuKSA9IGlzIHdoYXQgd2luOTUgYWN0dWFsbHkgdXNlcwogKiBMVEkgPSBsZWZ0IFRvcCBJbm5lciBsaW5lCiAqIExUTyA9IGxlZnQgVG9wIE91dGVyIGxpbmUKICogUkJJID0gUmlnaHQgQm90dG9tIElubmVyIGxpbmUKICogUkJPID0gUmlnaHQgQm90dG9tIE91dGVyIGxpbmUKICogMTUgPSBDT0xPUl9CVE5GQUNFCiAqIDE2ID0gQ09MT1JfQlROU0hBRE9XCiAqIDIwID0gQ09MT1JfQlROSElHSExJR0hUCiAqIDIxID0gQ09MT1JfM0RES1NIQURPVwogKiAyMiA9IENPTE9SXzNETElHSFQKICovCgoKc3RhdGljIEJPT0wgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShIREMgaGRjLCBMUFJFQ1QgcmMsIAoJCQkJICAgICBVSU5UIHVUeXBlLCBVSU5UIHVGbGFncykKewogICAgY2hhciBMVElubmVySSwgTFRPdXRlckk7CiAgICBjaGFyIFJCSW5uZXJJLCBSQk91dGVySTsKICAgIEhQRU4gTFRJbm5lclBlbiwgTFRPdXRlclBlbjsKICAgIEhQRU4gUkJJbm5lclBlbiwgUkJPdXRlclBlbjsKICAgIFJFQ1QgSW5uZXJSZWN0ID0gKnJjOwogICAgUE9JTlQgU2F2ZVBvaW50OwogICAgSFBFTiBTYXZlUGVuOwogICAgaW50IExCcGVucGx1cyA9IDA7CiAgICBpbnQgTFRwZW5wbHVzID0gMDsKICAgIGludCBSVHBlbnBsdXMgPSAwOwogICAgaW50IFJCcGVucGx1cyA9IDA7CiAgICBCT09MIHJldHZhbCA9ICEoICAgKCh1VHlwZSAmIEJEUl9JTk5FUikgPT0gQkRSX0lOTkVSCiAgICAgICAgICAgICAgICAgICAgICAgfHwgKHVUeXBlICYgQkRSX09VVEVSKSA9PSBCRFJfT1VURVIpCiAgICAgICAgICAgICAgICAgICAgICAmJiAhKHVGbGFncyAmIChCRl9GTEFUfEJGX01PTk8pKSApOwogICAgICAgIAogICAgLyogSW5pdCBzb21lIHZhcnMgKi8KICAgIExUSW5uZXJQZW4gPSBMVE91dGVyUGVuID0gUkJJbm5lclBlbiA9IFJCT3V0ZXJQZW4gPSAoSFBFTilHZXRTdG9ja09iamVjdChOVUxMX1BFTik7CiAgICBTYXZlUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KGhkYywgTFRJbm5lclBlbik7CgogICAgLyogRGV0ZXJtaW5lIHRoZSBjb2xvcnMgb2YgdGhlIGVkZ2VzICovCiAgICBpZih1RmxhZ3MgJiBCRl9NT05PKQogICAgewogICAgICAgIExUSW5uZXJJID0gUkJJbm5lckkgPSBMVFJCSW5uZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBMVE91dGVySSA9IFJCT3V0ZXJJID0gTFRSQk91dGVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICB9CiAgICBlbHNlIGlmKHVGbGFncyAmIEJGX0ZMQVQpCiAgICB7CiAgICAgICAgTFRJbm5lckkgPSBSQklubmVySSA9IExUUkJJbm5lckZsYXRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIExUT3V0ZXJJID0gUkJPdXRlckkgPSBMVFJCT3V0ZXJGbGF0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKCiAgICAgICAgLyogQmVydGhvIFN0dWx0aWVucyBzdGF0ZXMgYWJvdmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGV4YWN0bHkgbWF0Y2hlcyB3aW45NQogICAgICAgICAqIEluIHdpbjk4IEJGX0ZMQVQgcmVjdGFuZ2VscyBoYXZlIGFuIGlubmVyIGJvcmRlciBzYW1lIGNvbG9yIGFzIHRoZQoJICogbWlkZGxlIChDT0xPUl9CVE5GQUNFKS4gSSBiZWxpZXZlIGl0J3MgdGhlIHNhbWUgZm9yIHdpbjk1IGJ1dCBzaW5jZQoJICogSSBkb24ndCBrbm93IEkgZ28gd2l0aCBCZXJ0aG8gYW5kIGp1c3Qgc2V0cyBpdCBmb3Igd2luOTggdW50aWwgcHJvdmVuCgkgKiBvdGhlcndpc2UuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbm5pcyBCavZya2x1bmQsIDEwIEp1bmUsIDk5CgkgKi8KCWlmKCBUV0VBS19XaW5lTG9vayA9PSBXSU45OF9MT09LICYmIExUSW5uZXJJICE9IC0xICkJICAKICAgICAgICAgICAgTFRJbm5lckkgPSBSQklubmVySSA9IENPTE9SX0JUTkZBQ0U7CiAgICB9CiAgICBlbHNlIGlmKHVGbGFncyAmIEJGX1NPRlQpCiAgICB7CiAgICAgICAgTFRJbm5lckkgPSBMVElubmVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgTFRPdXRlckkgPSBMVE91dGVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgUkJJbm5lckkgPSBSQklubmVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgUkJPdXRlckkgPSBSQk91dGVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgTFRJbm5lckkgPSBMVElubmVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBMVE91dGVySSA9IExUT3V0ZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIFJCSW5uZXJJID0gUkJJbm5lck5vcm1hbFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgUkJPdXRlckkgPSBSQk91dGVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgIH0KCiAgICBpZigodUZsYWdzICYgQkZfQk9UVE9NTEVGVCkgPT0gQkZfQk9UVE9NTEVGVCkgICBMQnBlbnBsdXMgPSAxOwogICAgaWYoKHVGbGFncyAmIEJGX1RPUFJJR0hUKSA9PSBCRl9UT1BSSUdIVCkgICAgICAgUlRwZW5wbHVzID0gMTsKICAgIGlmKCh1RmxhZ3MgJiBCRl9CT1RUT01SSUdIVCkgPT0gQkZfQk9UVE9NUklHSFQpIFJCcGVucGx1cyA9IDE7CiAgICBpZigodUZsYWdzICYgQkZfVE9QTEVGVCkgPT0gQkZfVE9QTEVGVCkgICAgICAgICBMVHBlbnBsdXMgPSAxOwoKICAgIGlmKExUSW5uZXJJICE9IC0xKSBMVElubmVyUGVuID0gR2V0U3lzQ29sb3JQZW4oTFRJbm5lckkpOwogICAgaWYoTFRPdXRlckkgIT0gLTEpIExUT3V0ZXJQZW4gPSBHZXRTeXNDb2xvclBlbihMVE91dGVySSk7CiAgICBpZihSQklubmVySSAhPSAtMSkgUkJJbm5lclBlbiA9IEdldFN5c0NvbG9yUGVuKFJCSW5uZXJJKTsKICAgIGlmKFJCT3V0ZXJJICE9IC0xKSBSQk91dGVyUGVuID0gR2V0U3lzQ29sb3JQZW4oUkJPdXRlckkpOwoKICAgIE1vdmVUb0V4KGhkYywgMCwgMCwgJlNhdmVQb2ludCk7CgogICAgLyogRHJhdyB0aGUgb3V0ZXIgZWRnZSAqLwogICAgU2VsZWN0T2JqZWN0KGhkYywgTFRPdXRlclBlbik7CiAgICBpZih1RmxhZ3MgJiBCRl9UT1ApCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QubGVmdCwgSW5uZXJSZWN0LnRvcCwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgSW5uZXJSZWN0LnJpZ2h0LCBJbm5lclJlY3QudG9wKTsKICAgIH0KICAgIGlmKHVGbGFncyAmIEJGX0xFRlQpCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QubGVmdCwgSW5uZXJSZWN0LnRvcCwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgSW5uZXJSZWN0LmxlZnQsIElubmVyUmVjdC5ib3R0b20pOwogICAgfQogICAgU2VsZWN0T2JqZWN0KGhkYywgUkJPdXRlclBlbik7CiAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QucmlnaHQtMSwgSW5uZXJSZWN0LmJvdHRvbS0xLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QubGVmdC0xLCBJbm5lclJlY3QuYm90dG9tLTEpOwogICAgfQogICAgaWYodUZsYWdzICYgQkZfUklHSFQpCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QucmlnaHQtMSwgSW5uZXJSZWN0LmJvdHRvbS0xLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QucmlnaHQtMSwgSW5uZXJSZWN0LnRvcC0xKTsKICAgIH0KCiAgICAvKiBEcmF3IHRoZSBpbm5lciBlZGdlICovCiAgICBTZWxlY3RPYmplY3QoaGRjLCBMVElubmVyUGVuKTsKICAgIGlmKHVGbGFncyAmIEJGX1RPUCkKICAgIHsKICAgICAgICBNb3ZlVG9FeChoZGMsIElubmVyUmVjdC5sZWZ0K0xUcGVucGx1cywgSW5uZXJSZWN0LnRvcCsxLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QucmlnaHQtUlRwZW5wbHVzLCBJbm5lclJlY3QudG9wKzEpOwogICAgfQogICAgaWYodUZsYWdzICYgQkZfTEVGVCkKICAgIHsKICAgICAgICBNb3ZlVG9FeChoZGMsIElubmVyUmVjdC5sZWZ0KzEsIElubmVyUmVjdC50b3ArTFRwZW5wbHVzLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QubGVmdCsxLCBJbm5lclJlY3QuYm90dG9tLUxCcGVucGx1cyk7CiAgICB9CiAgICBTZWxlY3RPYmplY3QoaGRjLCBSQklubmVyUGVuKTsKICAgIGlmKHVGbGFncyAmIEJGX0JPVFRPTSkKICAgIHsKICAgICAgICBNb3ZlVG9FeChoZGMsIElubmVyUmVjdC5yaWdodC0xLVJCcGVucGx1cywgSW5uZXJSZWN0LmJvdHRvbS0yLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QubGVmdC0xK0xCcGVucGx1cywgSW5uZXJSZWN0LmJvdHRvbS0yKTsKICAgIH0KICAgIGlmKHVGbGFncyAmIEJGX1JJR0hUKQogICAgewogICAgICAgIE1vdmVUb0V4KGhkYywgSW5uZXJSZWN0LnJpZ2h0LTIsIElubmVyUmVjdC5ib3R0b20tMS1SQnBlbnBsdXMsIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIElubmVyUmVjdC5yaWdodC0yLCBJbm5lclJlY3QudG9wLTErUlRwZW5wbHVzKTsKICAgIH0KCiAgICBpZiggKCh1RmxhZ3MgJiBCRl9NSURETEUpICYmIHJldHZhbCkgfHwgKHVGbGFncyAmIEJGX0FESlVTVCkgKQogICAgewogICAgICAgIGludCBhZGQgPSAoTFRSQklubmVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV0gIT0gLTEgPyAxIDogMCkKICAgICAgICAgICAgICAgICsgKExUUkJPdXRlck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildICE9IC0xID8gMSA6IDApOwoKICAgICAgICBpZih1RmxhZ3MgJiBCRl9MRUZUKSAgIElubmVyUmVjdC5sZWZ0ICAgKz0gYWRkOwogICAgICAgIGlmKHVGbGFncyAmIEJGX1JJR0hUKSAgSW5uZXJSZWN0LnJpZ2h0ICAtPSBhZGQ7CiAgICAgICAgaWYodUZsYWdzICYgQkZfVE9QKSAgICBJbm5lclJlY3QudG9wICAgICs9IGFkZDsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pIElubmVyUmVjdC5ib3R0b20gLT0gYWRkOwoKICAgICAgICBpZigodUZsYWdzICYgQkZfTUlERExFKSAmJiByZXR2YWwpCgl7IAogICAgICAgICAgICBGaWxsUmVjdChoZGMsICZJbm5lclJlY3QsIEdldFN5c0NvbG9yQnJ1c2godUZsYWdzICYgQkZfTU9OTyA/IAoJCQkJCQkgICAgICAgQ09MT1JfV0lORE9XIDogQ09MT1JfQlRORkFDRSkpOwoJfQoKCWlmKHVGbGFncyAmIEJGX0FESlVTVCkKCSAgICAqcmMgPSBJbm5lclJlY3Q7CiAgICB9CgogICAgLyogQ2xlYW51cCAqLwogICAgU2VsZWN0T2JqZWN0KGhkYywgU2F2ZVBlbik7CiAgICBNb3ZlVG9FeChoZGMsIFNhdmVQb2ludC54LCBTYXZlUG9pbnQueSwgTlVMTCk7CiAgICByZXR1cm4gcmV0dmFsOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgRHJhd0VkZ2UxNiAgIChVU0VSLjY1OSkKICovCkJPT0wxNiBXSU5BUEkgRHJhd0VkZ2UxNiggSERDMTYgaGRjLCBMUFJFQ1QxNiByYywgVUlOVDE2IGVkZ2UsIFVJTlQxNiBmbGFncyApCnsKICAgIFJFQ1QgcmVjdDMyOwogICAgQk9PTCByZXQ7CgogICAgQ09OVl9SRUNUMTZUTzMyKCByYywgJnJlY3QzMiApOwogICAgcmV0ID0gRHJhd0VkZ2UoIGhkYywgJnJlY3QzMiwgZWRnZSwgZmxhZ3MgKTsKICAgIENPTlZfUkVDVDMyVE8xNiggJnJlY3QzMiwgcmMgKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgIERyYXdFZGdlMzIgICAoVVNFUjMyLjE1NSkKICovCkJPT0wgV0lOQVBJIERyYXdFZGdlKCBIREMgaGRjLCBMUFJFQ1QgcmMsIFVJTlQgZWRnZSwgVUlOVCBmbGFncyApCnsKICAgIFRSQUNFKCIlMDR4ICVkLCVkLSVkLCVkICUwNHggJTA0eFxuIiwKCSAgaGRjLCByYy0+bGVmdCwgcmMtPnRvcCwgcmMtPnJpZ2h0LCByYy0+Ym90dG9tLCBlZGdlLCBmbGFncyApOwoKICAgIGlmKGZsYWdzICYgQkZfRElBR09OQUwpCiAgICAgIHJldHVybiBVSVRPT0xTOTVfRHJhd0RpYWdFZGdlKGhkYywgcmMsIGVkZ2UsIGZsYWdzKTsKICAgIGVsc2UKICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoaGRjLCByYywgZWRnZSwgZmxhZ3MpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglVSVRPT0xTX01ha2VTcXVhcmVSZWN0CiAqCiAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgc3F1YXJlIHJlY3RhbmdsZSBhbmQgcmV0dXJuaW5nIHRoZSB3aWR0aAogKi8Kc3RhdGljIGludCBVSVRPT0xTX01ha2VTcXVhcmVSZWN0KExQUkVDVCBzcmMsIExQUkVDVCBkc3QpCnsKICAgIGludCBXaWR0aCAgPSBzcmMtPnJpZ2h0IC0gc3JjLT5sZWZ0OwogICAgaW50IEhlaWdodCA9IHNyYy0+Ym90dG9tIC0gc3JjLT50b3A7CiAgICBpbnQgU21hbGxEaWFtID0gV2lkdGggPiBIZWlnaHQgPyBIZWlnaHQgOiBXaWR0aDsKCiAgICAqZHN0ID0gKnNyYzsKCiAgICAvKiBNYWtlIGl0IGEgc3F1YXJlIGJveCAqLwogICAgaWYoV2lkdGggPCBIZWlnaHQpICAgICAgLyogU21hbGxEaWFtID09IFdpZHRoICovCiAgICB7CiAgICAgICAgZHN0LT50b3AgKz0gKEhlaWdodC1XaWR0aCkvMjsKICAgICAgICBkc3QtPmJvdHRvbSA9IGRzdC0+dG9wICsgU21hbGxEaWFtOwogICAgfQogICAgZWxzZSBpZihXaWR0aCA+IEhlaWdodCkgLyogU21hbGxEaWFtID09IEhlaWdodCAqLwogICAgewogICAgICAgIGRzdC0+bGVmdCArPSAoV2lkdGgtSGVpZ2h0KS8yOwogICAgICAgIGRzdC0+cmlnaHQgPSBkc3QtPmxlZnQgKyBTbWFsbERpYW07CiAgICB9CgogICByZXR1cm4gU21hbGxEaWFtOwp9CgpzdGF0aWMgdm9pZCBVSVRPT0xTX0RyYXdDaGVja2VkUmVjdCggSERDIGRjLCBMUFJFQ1QgcmVjdCApCnsKICAgIGlmKEdldFN5c0NvbG9yKENPTE9SX0JUTkhJR0hMSUdIVCkgPT0gUkdCKDI1NSwgMjU1LCAyNTUpKQogICAgewogICAgICBIQklUTUFQIGhibSA9IENyZWF0ZUJpdG1hcCg4LCA4LCAxLCAxLCB3UGF0dGVybl9BQTU1KTsKICAgICAgSEJSVVNIIGhic2F2ZTsKICAgICAgSEJSVVNIIGhiID0gQ3JlYXRlUGF0dGVybkJydXNoKGhibSk7CiAgICAgIENPTE9SUkVGIGJnOwoKICAgICAgRmlsbFJlY3QoZGMsIHJlY3QsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlRORkFDRSkpOwogICAgICBiZyA9IFNldEJrQ29sb3IoZGMsIFJHQigyNTUsIDI1NSwgMjU1KSk7CiAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBoYik7CiAgICAgIFBhdEJsdChkYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5yaWdodC1yZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20tcmVjdC0+dG9wLCAweDAwRkEwMDg5KTsKICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgICBTZXRCa0NvbG9yKGRjLCBiZyk7CiAgICAgIERlbGV0ZU9iamVjdChoYik7CiAgICAgIERlbGV0ZU9iamVjdChoYm0pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIEZpbGxSZWN0KGRjLCByZWN0LCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVVJVE9PTFNfREZDX0J1dHRvblB1c2gKICoKICogRHJhdyBhIHB1c2ggYnV0dG9uIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogKgogKiBEb2VzIGEgcHJldHR5IGdvb2Qgam9iIGluIGVtdWxhdGluZyBNUyBiZWhhdmlvci4gU29tZSBxdWlya3MgYXJlCiAqIGhvd2V2ZXIgdGhlcmUgYmVjYXVzZSBNUyB1c2VzIGEgVHJ1ZVR5cGUgZm9udCAoTWFybGV0dCkgdG8gZHJhdwogKiB0aGUgYnV0dG9ucy4KICovCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9ERkNfQnV0dG9uUHVzaChIREMgZGMsIExQUkVDVCByLCBVSU5UIHVGbGFncykKewogICAgVUlOVCBlZGdlOwogICAgUkVDVCBteXIgPSAqcjsKCiAgICBpZih1RmxhZ3MgJiAoREZDU19QVVNIRUQgfCBERkNTX0NIRUNLRUQgfCBERkNTX0ZMQVQpKQogICAgICAgIGVkZ2UgPSBFREdFX1NVTktFTjsKICAgIGVsc2UKICAgICAgICBlZGdlID0gRURHRV9SQUlTRUQ7CgogICAgaWYodUZsYWdzICYgREZDU19DSEVDS0VEKQogICAgewogICAgICAgIGlmKHVGbGFncyAmIERGQ1NfTU9OTykKICAgICAgICAgICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShkYywgJm15ciwgZWRnZSwgQkZfTU9OT3xCRl9SRUNUfEJGX0FESlVTVCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBVSVRPT0xTOTVfRHJhd1JlY3RFZGdlKGRjLCAmbXlyLCBlZGdlLCAodUZsYWdzJkRGQ1NfRkxBVCl8QkZfUkVDVHxCRl9TT0ZUfEJGX0FESlVTVCk7CgoJVUlUT09MU19EcmF3Q2hlY2tlZFJlY3QoIGRjLCAmbXlyICk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgaWYodUZsYWdzICYgREZDU19NT05PKQogICAgICAgIHsKICAgICAgICAgICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShkYywgJm15ciwgZWRnZSwgQkZfTU9OT3xCRl9SRUNUfEJGX0FESlVTVCk7CiAgICAgICAgICAgIEZpbGxSZWN0KGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkZBQ0UpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShkYywgciwgZWRnZSwgKHVGbGFncyZERkNTX0ZMQVQpIHwgQkZfTUlERExFIHxCRl9TT0ZUfCBCRl9SRUNUKTsKICAgICAgICB9CiAgICB9CgogICAgLyogQWRqdXN0IHJlY3RhbmdsZSBpZiBhc2tlZCAqLwogICAgaWYodUZsYWdzICYgREZDU19BREpVU1RSRUNUKQogICAgewogICAgICAgIHItPmxlZnQgICArPSAyOwogICAgICAgIHItPnJpZ2h0ICAtPSAyOwogICAgICAgIHItPnRvcCAgICArPSAyOwogICAgICAgIHItPmJvdHRvbSAtPSAyOwogICAgfQoKICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglVSVRPT0xTX0RGQ19CdXR0b25DaGNlawogKgogKiBEcmF3IGEgY2hlY2svM3N0YXRlIGJ1dHRvbiBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKICoKICogRG9lcyBhIHByZXR0eSBnb29kIGpvYiBpbiBlbXVsYXRpbmcgTVMgYmVoYXZpb3IuIFNvbWUgcXVpcmtzIGFyZQogKiBob3dldmVyIHRoZXJlIGJlY2F1c2UgTVMgdXNlcyBhIFRydWVUeXBlIGZvbnQgKE1hcmxldHQpIHRvIGRyYXcKICogdGhlIGJ1dHRvbnMuCiAqLwojZGVmaW5lIERGQ19DSEVDS1BPSU5UU01BWCAgICAgIDYKCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9ERkNfQnV0dG9uQ2hlY2soSERDIGRjLCBMUFJFQ1QgciwgVUlOVCB1RmxhZ3MpCnsKICAgIFJFQ1QgbXlyOwogICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cik7CiAgICBVSU5UIGZsYWdzID0gQkZfUkVDVCB8IEJGX0FESlVTVDsKCiAgICBpZih1RmxhZ3MgJiBERkNTX0ZMQVQpIGZsYWdzIHw9IEJGX0ZMQVQ7CiAgICBlbHNlIGlmKHVGbGFncyAmIERGQ1NfTU9OTykgZmxhZ3MgfD0gQkZfTU9OTzsKCiAgICBVSVRPT0xTOTVfRHJhd1JlY3RFZGdlKCBkYywgJm15ciwgRURHRV9TVU5LRU4sIGZsYWdzICk7CgogICAgaWYodUZsYWdzICYgKERGQ1NfSU5BQ1RJVkV8REZDU19QVVNIRUQpKQogICAgICAgIEZpbGxSZWN0KGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkZBQ0UpKTsKICAgIGVsc2UgaWYoICh1RmxhZ3MgJiBERkNTX0JVVFRPTjNTVEFURSkgJiYgKHVGbGFncyAmIERGQ1NfQ0hFQ0tFRCkgKQogICAgICAgIFVJVE9PTFNfRHJhd0NoZWNrZWRSZWN0KCBkYywgJm15ciApOwogICAgZWxzZQogICAgewogICAgICAgIEZpbGxSZWN0KGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX1dJTkRPVykpOwogICAgfQoKICAgIGlmKHVGbGFncyAmIERGQ1NfQ0hFQ0tFRCkKICAgIHsKICAgICAgICBQT0lOVCBDaGVja1BvaW50c1tERkNfQ0hFQ0tQT0lOVFNNQVhdOwogICAgICAgIGludCBpOwogICAgICAgIEhCUlVTSCBoYnNhdmU7CiAgICAgICAgSFBFTiBocHNhdmU7CgogICAgICAgIC8qIEZJWE1FOiBUaGlzIGNvbWVzIHZlcnkgY2xvc2UgdG8gTSQncyBjaGVja21hcmssIGJ1dCBub3QgKi8KICAgICAgICAvKiBleGFjdGx5Li4uIFdoZW4gc21hbGwgb3IgbGFyZ2UgdGhlcmUgaXMgYSBmZXcgcGl4ZWxzICovCiAgICAgICAgLyogc2hpZnQuIE5vdCBiYWQsIGJ1dCBjb3VsZCBiZSBiZXR0ZXIgOikgKi8KICAgICAgICBVSVRPT0xTX01ha2VTcXVhcmVSZWN0KHIsICZteXIpOwogICAgICAgIENoZWNrUG9pbnRzWzBdLnggPSBteXIubGVmdCArIDI1MypTbWFsbERpYW0vMTAwMDsKICAgICAgICBDaGVja1BvaW50c1swXS55ID0gbXlyLnRvcCAgKyAzNDUqU21hbGxEaWFtLzEwMDA7CiAgICAgICAgQ2hlY2tQb2ludHNbMV0ueCA9IG15ci5sZWZ0ICsgNDA5KlNtYWxsRGlhbS8xMDAwOwogICAgICAgIENoZWNrUG9pbnRzWzFdLnkgPSBDaGVja1BvaW50c1swXS55ICsgKENoZWNrUG9pbnRzWzFdLngtQ2hlY2tQb2ludHNbMF0ueCk7CiAgICAgICAgQ2hlY2tQb2ludHNbMl0ueCA9IG15ci5sZWZ0ICsgNjkwKlNtYWxsRGlhbS8xMDAwOwogICAgICAgIENoZWNrUG9pbnRzWzJdLnkgPSBDaGVja1BvaW50c1sxXS55IC0gKENoZWNrUG9pbnRzWzJdLngtQ2hlY2tQb2ludHNbMV0ueCk7CiAgICAgICAgQ2hlY2tQb2ludHNbM10ueCA9IENoZWNrUG9pbnRzWzJdLng7CiAgICAgICAgQ2hlY2tQb2ludHNbM10ueSA9IENoZWNrUG9pbnRzWzJdLnkgKyAzKlNtYWxsRGlhbS8xNjsKICAgICAgICBDaGVja1BvaW50c1s0XS54ID0gQ2hlY2tQb2ludHNbMV0ueDsKICAgICAgICBDaGVja1BvaW50c1s0XS55ID0gQ2hlY2tQb2ludHNbMV0ueSArIDMqU21hbGxEaWFtLzE2OwogICAgICAgIENoZWNrUG9pbnRzWzVdLnggPSBDaGVja1BvaW50c1swXS54OwogICAgICAgIENoZWNrUG9pbnRzWzVdLnkgPSBDaGVja1BvaW50c1swXS55ICsgMypTbWFsbERpYW0vMTY7CgogICAgICAgIGkgPSAodUZsYWdzICYgREZDU19JTkFDVElWRSkgfHwgKHVGbGFncyAmIDB4ZmYpID09IERGQ1NfQlVUVE9OM1NUQVRFID8gQ09MT1JfQlROU0hBRE9XIDogQ09MT1JfV0lORE9XVEVYVDsKICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChpKSk7CiAgICAgICAgaHBzYXZlID0gKEhQRU4pU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvclBlbihpKSk7CiAgICAgICAgUG9seWdvbihkYywgQ2hlY2tQb2ludHMsIERGQ19DSEVDS1BPSU5UU01BWCk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglVSVRPT0xTX0RGQ19CdXR0b25SYWRpbwogKgogKiBEcmF3IGEgcmFkaW8vcmFkaW9pbWFnZS9yYWRpb21hc2sgYnV0dG9uIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogKgogKiBEb2VzIGEgcHJldHR5IGdvb2Qgam9iIGluIGVtdWxhdGluZyBNUyBiZWhhdmlvci4gU29tZSBxdWlya3MgYXJlCiAqIGhvd2V2ZXIgdGhlcmUgYmVjYXVzZSBNUyB1c2VzIGEgVHJ1ZVR5cGUgZm9udCAoTWFybGV0dCkgdG8gZHJhdwogKiB0aGUgYnV0dG9ucy4KICovCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9ERkNfQnV0dG9uUmFkaW8oSERDIGRjLCBMUFJFQ1QgciwgVUlOVCB1RmxhZ3MpCnsKICAgIFJFQ1QgbXlyOwogICAgaW50IGk7CiAgICBpbnQgU21hbGxEaWFtID0gVUlUT09MU19NYWtlU3F1YXJlUmVjdChyLCAmbXlyKTsKICAgIGludCBCb3JkZXJTaHJpbmsgPSBTbWFsbERpYW0gLyAxNjsKICAgIEhQRU4gaHBzYXZlOwogICAgSEJSVVNIIGhic2F2ZTsKICAgIGludCB4ZSwgeWU7CiAgICBpbnQgeGMsIHljOwoKICAgIGlmKEJvcmRlclNocmluayA8IDEpIEJvcmRlclNocmluayA9IDE7CgogICAgaWYoKHVGbGFncyAmIDB4ZmYpID09IERGQ1NfQlVUVE9OUkFESU9JTUFHRSkKICAgIHsKICAgICAgICBGaWxsUmVjdChkYywgciwgKEhCUlVTSClHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCkpOwogICAgfQoKICAgIHhlID0gbXlyLmxlZnQ7CiAgICB5ZSA9IG15ci50b3AgICsgU21hbGxEaWFtIC0gU21hbGxEaWFtLzI7CgogICAgeGMgPSBteXIubGVmdCArIFNtYWxsRGlhbSAtIFNtYWxsRGlhbS8yOwogICAgeWMgPSBteXIudG9wICArIFNtYWxsRGlhbSAtIFNtYWxsRGlhbS8yOwoKICAgIC8qIERlZmluZSBib3VuZGluZyBib3ggKi8KICAgIGkgPSAxNCpTbWFsbERpYW0vMTY7CiAgICBteXIubGVmdCAgID0geGMgLSBpK2kvMjsKICAgIG15ci5yaWdodCAgPSB4YyArIGkvMjsKICAgIG15ci50b3AgICAgPSB5YyAtIGkraS8yOwogICAgbXlyLmJvdHRvbSA9IHljICsgaS8yOwoKICAgIGlmKCh1RmxhZ3MgJiAweGZmKSA9PSBERkNTX0JVVFRPTlJBRElPTUFTSykKICAgIHsKICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3RvY2tPYmplY3QoQkxBQ0tfQlJVU0gpKTsKICAgICAgICBQaWUoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQsIG15ci5ib3R0b20sIHhlLCB5ZSwgeGUsIHllKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYodUZsYWdzICYgKERGQ1NfRkxBVHxERkNTX01PTk8pKQogICAgICAgIHsKICAgICAgICAgICAgaHBzYXZlID0gKEhQRU4pU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvclBlbihDT0xPUl9XSU5ET1dGUkFNRSkpOwogICAgICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9XSU5ET1dGUkFNRSkpOwogICAgICAgICAgICBQaWUoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQsIG15ci5ib3R0b20sIHhlLCB5ZSwgeGUsIHllKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgICAgICBQaWUoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQsIG15ci5ib3R0b20sIG15ci5sZWZ0LTEsIG15ci5ib3R0b20sIG15ci5yaWdodC0xLCBteXIudG9wKTsKCiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfQlROU0hBRE9XKSk7CiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5TSEFET1cpKTsKICAgICAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCBteXIucmlnaHQrMSwgbXlyLnRvcCwgbXlyLmxlZnQrMSwgbXlyLmJvdHRvbSk7CgogICAgICAgICAgICBteXIubGVmdCAgICs9IEJvcmRlclNocmluazsKICAgICAgICAgICAgbXlyLnJpZ2h0ICAtPSBCb3JkZXJTaHJpbms7CiAgICAgICAgICAgIG15ci50b3AgICAgKz0gQm9yZGVyU2hyaW5rOwogICAgICAgICAgICBteXIuYm90dG9tIC09IEJvcmRlclNocmluazsKCiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfM0RMSUdIVCkpOwogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfM0RMSUdIVCkpOwogICAgICAgICAgICBQaWUoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQsIG15ci5ib3R0b20sIG15ci5sZWZ0LTEsIG15ci5ib3R0b20sIG15ci5yaWdodC0xLCBteXIudG9wKTsKCiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfM0RES1NIQURPVykpOwogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfM0RES1NIQURPVykpOwogICAgICAgICAgICBQaWUoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQsIG15ci5ib3R0b20sIG15ci5yaWdodCsxLCBteXIudG9wLCBteXIubGVmdCsxLCBteXIuYm90dG9tKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICAgICAgfQoKICAgICAgICBpID0gMTAqU21hbGxEaWFtLzE2OwogICAgICAgIG15ci5sZWZ0ICAgPSB4YyAtIGkraS8yOwogICAgICAgIG15ci5yaWdodCAgPSB4YyArIGkvMjsKICAgICAgICBteXIudG9wICAgID0geWMgLSBpK2kvMjsKICAgICAgICBteXIuYm90dG9tID0geWMgKyBpLzI7CiAgICAgICAgaT0gISh1RmxhZ3MgJiAoREZDU19JTkFDVElWRXxERkNTX1BVU0hFRCkpID8gQ09MT1JfV0lORE9XIDogQ09MT1JfQlRORkFDRTsKICAgICAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKGkpKTsKICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChpKSk7CiAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCB4ZSwgeWUsIHhlLCB5ZSk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgIH0KCiAgICBpZih1RmxhZ3MgJiBERkNTX0NIRUNLRUQpCiAgICB7CiAgICAgICAgaSA9IDYqU21hbGxEaWFtLzE2OwogICAgICAgIGkgPSBpIDwgMSA/IDEgOiBpOwogICAgICAgIG15ci5sZWZ0ICAgPSB4YyAtIGkraS8yOwogICAgICAgIG15ci5yaWdodCAgPSB4YyArIGkvMjsKICAgICAgICBteXIudG9wICAgID0geWMgLSBpK2kvMjsKICAgICAgICBteXIuYm90dG9tID0geWMgKyBpLzI7CgogICAgICAgIGkgPSB1RmxhZ3MgJiBERkNTX0lOQUNUSVZFID8gQ09MT1JfQlROU0hBRE9XIDogQ09MT1JfV0lORE9XVEVYVDsKICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChpKSk7CiAgICAgICAgaHBzYXZlID0gKEhQRU4pU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvclBlbihpKSk7CiAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCB4ZSwgeWUsIHhlLCB5ZSk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgIH0KCiAgICAvKiBGSVhNRTogTSQgaGFzIGEgcG9seWdvbiBpbiB0aGUgY2VudGVyIGF0IHJlbGF0aXZlIHBvaW50czogKi8KICAgIC8qIDAuNDc2LCAwLjQ3NiAodGltZXMgU21hbGxEaWFtLCBTbWFsbERpYW0pICovCiAgICAvKiAwLjQ3NiwgMC41MjUgKi8KICAgIC8qIDAuNTAwLCAwLjUwMCAqLwogICAgLyogMC41MDAsIDAuNDk5ICovCiAgICAvKiB3aGVuIHRoZSBidXR0b24gaXMgdW5jaGVja2VkLiBUaGUgcmVhc29uIGZvciBpdCBpcyB1bmtub3duLiBUaGUgKi8KICAgIC8qIGNvbG9yIGlzIENPTE9SX0JUTkhJR0hMSUdIVCwgYWx0aG91Z2ggdGhlIHBvbHlnb24gZ2V0cyBwYWludGVkIGF0ICovCiAgICAvKiBsZWFzdCAzIHRpbWVzIChpdCBsb29rcyBsaWtlIGEgY2xpcC1yZWdpb24gd2hlbiB5b3Ugc2VlIGl0IGhhcHBlbikuICovCiAgICAvKiBJIGRvIG5vdCByZWFsbHkgc2VlIGEgcmVhc29uIHdoeSB0aGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZC4gSWYgeW91ICovCiAgICAvKiBoYXZlIGEgZ29vZCByZWFzb24sIGxldCBtZSBrbm93LiBNYXliZSB0aGlzIGlzIGEgcXVpcmsgaW4gdGhlIE1hcmxldHQgKi8KICAgIC8qIGZvbnQuICovCgogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVUlUT09MU19EcmF3RnJhbWVCdXR0b24KICovCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9EcmF3RnJhbWVCdXR0b24oSERDIGhkYywgTFBSRUNUIHJjLCBVSU5UIHVTdGF0ZSkKewogICAgc3dpdGNoKHVTdGF0ZSAmIDB4ZmYpCiAgICB7CiAgICBjYXNlIERGQ1NfQlVUVE9OUFVTSDoKICAgICAgICByZXR1cm4gVUlUT09MUzk1X0RGQ19CdXR0b25QdXNoKGhkYywgcmMsIHVTdGF0ZSk7CgogICAgY2FzZSBERkNTX0JVVFRPTkNIRUNLOgogICAgY2FzZSBERkNTX0JVVFRPTjNTVEFURToKICAgICAgICByZXR1cm4gVUlUT09MUzk1X0RGQ19CdXR0b25DaGVjayhoZGMsIHJjLCB1U3RhdGUpOwoKICAgIGNhc2UgREZDU19CVVRUT05SQURJT0lNQUdFOgogICAgY2FzZSBERkNTX0JVVFRPTlJBRElPTUFTSzoKICAgIGNhc2UgREZDU19CVVRUT05SQURJTzoKICAgICAgICByZXR1cm4gVUlUT09MUzk1X0RGQ19CdXR0b25SYWRpbyhoZGMsIHJjLCB1U3RhdGUpOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgV0FSTigiSW52YWxpZCBidXR0b24gc3RhdGU9MHglMDR4XG4iLCB1U3RhdGUpOwogICAgfQoKICAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBVSVRPT0xTX0RyYXdGcmFtZUNhcHRpb24KICoKICogRHJhdyBjYXB0aW9uIGJ1dHRvbnMgKHdpbjk1KSwgY29taW5nIGZyb20gRHJhd0ZyYW1lQ29udHJvbCgpCiAqLwoKc3RhdGljIEJPT0wgVUlUT09MUzk1X0RyYXdGcmFtZUNhcHRpb24oSERDIGRjLCBMUFJFQ1QgciwgVUlOVCB1RmxhZ3MpCnsKICAgIFBPSU5UIExpbmUxWzEwXTsKICAgIFBPSU5UIExpbmUyWzEwXTsKICAgIGludCBMaW5lMU47CiAgICBpbnQgTGluZTJOOwogICAgUkVDVCBteXI7CiAgICBpbnQgU21hbGxEaWFtID0gVUlUT09MU19NYWtlU3F1YXJlUmVjdChyLCAmbXlyKS0yOwogICAgaW50IGk7CiAgICBIQlJVU0ggaGJzYXZlOwogICAgSFBFTiBocHNhdmU7CiAgICBIRk9OVCBoZnNhdmUsIGhmOwogICAgaW50IHhjID0gKG15ci5sZWZ0K215ci5yaWdodCkvMjsKICAgIGludCB5YyA9IChteXIudG9wK215ci5ib3R0b20pLzI7CiAgICBpbnQgZWRnZSwgbW92ZTsKICAgIGNoYXIgc3RyWzJdID0gIj8iOwogICAgVUlOVCBhbGlnbnNhdmU7CiAgICBpbnQgYmtzYXZlOwogICAgQ09MT1JSRUYgY2xyc2F2ZTsKICAgIFNJWkUgc2l6ZTsKCiAgICBVSVRPT0xTOTVfREZDX0J1dHRvblB1c2goZGMsIHIsIHVGbGFncyAmIDB4ZmYwMCk7CgogICAgc3dpdGNoKHVGbGFncyAmIDB4ZmYpCiAgICB7CiAgICBjYXNlIERGQ1NfQ0FQVElPTkNMT1NFOgogICAgICAgIGVkZ2UgPSAzMjgqU21hbGxEaWFtLzEwMDA7CiAgICAgICAgbW92ZSA9IDk1KlNtYWxsRGlhbS8xMDAwOwogICAgICAgIExpbmUxWzBdLnggPSBMaW5lMlswXS54ID0gTGluZTFbMV0ueCA9IExpbmUyWzFdLnggPSB4YyAtIGVkZ2U7CiAgICAgICAgTGluZTFbMl0ueSA9IExpbmUyWzVdLnkgPSBMaW5lMVsxXS55ID0gTGluZTJbNF0ueSA9IHljIC0gZWRnZTsKICAgICAgICBMaW5lMVszXS54ID0gTGluZTJbM10ueCA9IExpbmUxWzRdLnggPSBMaW5lMls0XS54ID0geGMgKyBlZGdlOwogICAgICAgIExpbmUxWzVdLnkgPSBMaW5lMlsyXS55ID0gTGluZTFbNF0ueSA9IExpbmUyWzFdLnkgPSB5YyArIGVkZ2U7CiAgICAgICAgTGluZTFbMl0ueCA9IExpbmUyWzJdLnggPSBMaW5lMVsxXS54ICsgbW92ZTsKICAgICAgICBMaW5lMVswXS55ID0gTGluZTJbM10ueSA9IExpbmUxWzFdLnkgKyBtb3ZlOwogICAgICAgIExpbmUxWzVdLnggPSBMaW5lMls1XS54ID0gTGluZTFbNF0ueCAtIG1vdmU7CiAgICAgICAgTGluZTFbM10ueSA9IExpbmUyWzBdLnkgPSBMaW5lMVs0XS55IC0gbW92ZTsKICAgICAgICBMaW5lMU4gPSA2OwogICAgICAgIExpbmUyTiA9IDY7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX0NBUFRJT05IRUxQOgogICAgICAgIC8qIFRoaXMgb25lIGJyZWFrcyB0aGUgZmxvdyAqLwogICAgICAgIC8qIEZJWE1FOiBXZSBuZWVkIHRoZSBNYXJsZXR0IGZvbnQgaW4gb3JkZXIgdG8gZ2V0IHRoaXMgcmlnaHQuICovCgogICAgICAgIGhmID0gQ3JlYXRlRm9udEEoLVNtYWxsRGlhbSwgMCwgMCwgMCwgRldfTk9STUFMLCBGQUxTRSwgRkFMU0UsIEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICBBTlNJX0NIQVJTRVQsIE9VVF9ERUZBVUxUX1BSRUNJUywgQ0xJUF9ERUZBVUxUX1BSRUNJUywKICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9RVUFMSVRZLCBGSVhFRF9QSVRDSHxGRl9ET05UQ0FSRSwgIlN5c3RlbSIpOwogICAgICAgIGFsaWduc2F2ZSA9IFNldFRleHRBbGlnbihkYywgVEFfVE9QfFRBX0xFRlQpOwogICAgICAgIGJrc2F2ZSA9IFNldEJrTW9kZShkYywgVFJBTlNQQVJFTlQpOwogICAgICAgIGNscnNhdmUgPSBHZXRUZXh0Q29sb3IoZGMpOwogICAgICAgIGhmc2F2ZSA9IChIRk9OVClTZWxlY3RPYmplY3QoZGMsIGhmKTsKICAgICAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMkEoZGMsIHN0ciwgMSwgJnNpemUpOwoKICAgICAgICBpZih1RmxhZ3MgJiBERkNTX0lOQUNUSVZFKQogICAgICAgIHsKICAgICAgICAgICAgU2V0VGV4dENvbG9yKGRjLCBHZXRTeXNDb2xvcihDT0xPUl9CVE5ISUdITElHSFQpKTsKICAgICAgICAgICAgVGV4dE91dEEoZGMsIHhjLXNpemUuY3gvMisxLCB5Yy1zaXplLmN5LzIrMSwgc3RyLCAxKTsKICAgICAgICB9CiAgICAgICAgU2V0VGV4dENvbG9yKGRjLCBHZXRTeXNDb2xvcih1RmxhZ3MgJiBERkNTX0lOQUNUSVZFID8gQ09MT1JfQlROU0hBRE9XIDogQ09MT1JfQlROVEVYVCkpOwogICAgICAgIFRleHRPdXRBKGRjLCB4Yy1zaXplLmN4LzIsIHljLXNpemUuY3kvMiwgc3RyLCAxKTsKCiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoZnNhdmUpOwogICAgICAgIFNldFRleHRDb2xvcihkYywgY2xyc2F2ZSk7CiAgICAgICAgU2V0QmtNb2RlKGRjLCBia3NhdmUpOwogICAgICAgIFNldFRleHRBbGlnbihkYywgYWxpZ25zYXZlKTsKICAgICAgICBEZWxldGVPYmplY3QoaGYpOwogICAgICAgIHJldHVybiBUUlVFOwoKICAgIGNhc2UgREZDU19DQVBUSU9OTUlOOgogICAgICAgIExpbmUxWzBdLnggPSBMaW5lMVszXS54ID0gbXlyLmxlZnQgICArICA5NipTbWFsbERpYW0vNzUwKzI7CiAgICAgICAgTGluZTFbMV0ueCA9IExpbmUxWzJdLnggPSBMaW5lMVswXS54ICsgMzcyKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbMF0ueSA9IExpbmUxWzFdLnkgPSBteXIudG9wICAgICsgNTYzKlNtYWxsRGlhbS83NTArMTsKICAgICAgICBMaW5lMVsyXS55ID0gTGluZTFbM10ueSA9IExpbmUxWzBdLnkgKyAgOTIqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMU4gPSA0OwogICAgICAgIExpbmUyTiA9IDA7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX0NBUFRJT05NQVg6CiAgICAgICAgZWRnZSA9IDQ3KlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbMF0ueCA9IExpbmUxWzVdLnggPSBteXIubGVmdCArICA1NypTbWFsbERpYW0vNzUwKzM7CiAgICAgICAgTGluZTFbMF0ueSA9IExpbmUxWzFdLnkgPSBteXIudG9wICArIDE0MypTbWFsbERpYW0vNzUwKzE7CiAgICAgICAgTGluZTFbMV0ueCA9IExpbmUxWzJdLnggPSBMaW5lMVswXS54ICsgNTYyKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbNV0ueSA9IExpbmUxWzRdLnkgPSBMaW5lMVswXS55ICsgIDkzKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbMl0ueSA9IExpbmUxWzNdLnkgPSBMaW5lMVswXS55ICsgNTEzKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbM10ueCA9IExpbmUxWzRdLnggPSBMaW5lMVsxXS54IC0gIGVkZ2U7CgogICAgICAgIExpbmUyWzBdLnggPSBMaW5lMls1XS54ID0gTGluZTFbMF0ueDsKICAgICAgICBMaW5lMlszXS54ID0gTGluZTJbNF0ueCA9IExpbmUxWzFdLng7CiAgICAgICAgTGluZTJbMV0ueCA9IExpbmUyWzJdLnggPSBMaW5lMVswXS54ICsgZWRnZTsKICAgICAgICBMaW5lMlswXS55ID0gTGluZTJbMV0ueSA9IExpbmUxWzBdLnk7CiAgICAgICAgTGluZTJbNF0ueSA9IExpbmUyWzVdLnkgPSBMaW5lMVsyXS55OwogICAgICAgIExpbmUyWzJdLnkgPSBMaW5lMlszXS55ID0gTGluZTFbMl0ueSAtIGVkZ2U7CiAgICAgICAgTGluZTFOID0gNjsKICAgICAgICBMaW5lMk4gPSA2OwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREZDU19DQVBUSU9OUkVTVE9SRToKICAgICAgICAvKiBGSVhNRTogdGhpcyBvbmUgbG9va3MgYmFkIGF0IHNtYWxsIHNpemVzIDwgMTV4MTUgOiggKi8KICAgICAgICBlZGdlID0gNDcqU21hbGxEaWFtLzc1MDsKICAgICAgICBtb3ZlID0gNDIwKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbMF0ueCA9IExpbmUxWzldLnggPSBteXIubGVmdCArIDE5OCpTbWFsbERpYW0vNzUwKzI7CiAgICAgICAgTGluZTFbMF0ueSA9IExpbmUxWzFdLnkgPSBteXIudG9wICArIDE2OSpTbWFsbERpYW0vNzUwKzE7CiAgICAgICAgTGluZTFbNl0ueSA9IExpbmUxWzddLnkgPSBMaW5lMVswXS55ICsgOTMqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMVs3XS54ID0gTGluZTFbOF0ueCA9IExpbmUxWzBdLnggKyBlZGdlOwogICAgICAgIExpbmUxWzFdLnggPSBMaW5lMVsyXS54ID0gTGluZTFbMF0ueCArIG1vdmU7CiAgICAgICAgTGluZTFbNV0ueCA9IExpbmUxWzZdLnggPSBMaW5lMVsxXS54IC0gZWRnZTsKICAgICAgICBMaW5lMVs5XS55ID0gTGluZTFbOF0ueSA9IExpbmUxWzBdLnkgKyAxODcqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMVsyXS55ID0gTGluZTFbM10ueSA9IExpbmUxWzBdLnkgKyAzMjcqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMVs0XS55ID0gTGluZTFbNV0ueSA9IExpbmUxWzJdLnkgLSBlZGdlOwogICAgICAgIExpbmUxWzNdLnggPSBMaW5lMVs0XS54ID0gTGluZTFbMl0ueCAtIDE0MCpTbWFsbERpYW0vNzUwOwoKICAgICAgICBMaW5lMlsxXS54ID0gTGluZTJbMl0ueCA9IExpbmUxWzNdLng7CiAgICAgICAgTGluZTJbN10ueCA9IExpbmUyWzhdLnggPSBMaW5lMlsxXS54IC0gZWRnZTsKICAgICAgICBMaW5lMlswXS54ID0gTGluZTJbOV0ueCA9IExpbmUyWzNdLnggPSBMaW5lMls0XS54ID0gTGluZTJbMV0ueCAtIG1vdmU7CiAgICAgICAgTGluZTJbNV0ueCA9IExpbmUyWzZdLnggPSBMaW5lMlswXS54ICsgZWRnZTsKICAgICAgICBMaW5lMlswXS55ID0gTGluZTJbMV0ueSA9IExpbmUxWzldLnk7CiAgICAgICAgTGluZTJbNF0ueSA9IExpbmUyWzVdLnkgPSBMaW5lMls4XS55ID0gTGluZTJbOV0ueSA9IExpbmUyWzBdLnkgKyA5MypTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUyWzJdLnkgPSBMaW5lMlszXS55ID0gTGluZTJbMF0ueSArIDMyNypTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUyWzZdLnkgPSBMaW5lMls3XS55ID0gTGluZTJbMl0ueSAtIGVkZ2U7CiAgICAgICAgTGluZTFOID0gMTA7CiAgICAgICAgTGluZTJOID0gMTA7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBXQVJOKCJJbnZhbGlkIGNhcHRpb247IGZsYWdzPTB4JTA0eFxuIiwgdUZsYWdzKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgLyogSGVyZSB0aGUgZHJhd2luZyB0YWtlcyBwbGFjZSAqLwogICAgaWYodUZsYWdzICYgREZDU19JTkFDVElWRSkKICAgIHsKICAgICAgICAvKiBJZiB3ZSBoYXZlIGFuIGluYWN0aXZlIGJ1dHRvbiwgdGhlbiB5b3Ugc2VlIGEgc2hhZG93ICovCiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgICAgaHBzYXZlID0gKEhQRU4pU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvclBlbihDT0xPUl9CVE5ISUdITElHSFQpKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lMSwgTGluZTFOKTsKICAgICAgICBpZihMaW5lMk4gPiAwKQogICAgICAgICAgICBQb2x5Z29uKGRjLCBMaW5lMiwgTGluZTJOKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgfQoKICAgIC8qIENvcnJlY3QgZm9yIHRoZSBzaGFkb3cgc2hpZnQgKi8KICAgIGZvcihpID0gMDsgaSA8IExpbmUxTjsgaSsrKQogICAgewogICAgICAgIExpbmUxW2ldLngtLTsKICAgICAgICBMaW5lMVtpXS55LS07CiAgICB9CiAgICBmb3IoaSA9IDA7IGkgPCBMaW5lMk47IGkrKykKICAgIHsKICAgICAgICBMaW5lMltpXS54LS07CiAgICAgICAgTGluZTJbaV0ueS0tOwogICAgfQoKICAgIC8qIE1ha2UgdGhlIGZpbmFsIHBpY3R1cmUgKi8KICAgIGkgPSB1RmxhZ3MgJiBERkNTX0lOQUNUSVZFID8gQ09MT1JfQlROU0hBRE9XIDogQ09MT1JfQlROVEVYVDsKICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKGkpKTsKICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oaSkpOwoKICAgIFBvbHlnb24oZGMsIExpbmUxLCBMaW5lMU4pOwogICAgaWYoTGluZTJOID4gMCkKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lMiwgTGluZTJOKTsKICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBVSVRPT0xTX0RyYXdGcmFtZVNjcm9sbAogKgogKiBEcmF3IGEgc2Nyb2xsLWJhciBjb250cm9sIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogKi8Kc3RhdGljIEJPT0wgVUlUT09MUzk1X0RyYXdGcmFtZVNjcm9sbChIREMgZGMsIExQUkVDVCByLCBVSU5UIHVGbGFncykKewogICAgUE9JTlQgTGluZVs0XTsKICAgIFJFQ1QgbXlyOwogICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cikgLSAyOwogICAgaW50IGk7CiAgICBIQlJVU0ggaGJzYXZlLCBoYiwgaGIyOwogICAgSFBFTiBocHNhdmUsIGhwLCBocDI7CiAgICBpbnQgdHJpID0gMjkwKlNtYWxsRGlhbS8xMDAwIC0gMTsKICAgIGludCBkNDYsIGQ5MzsKCiAgICAvKgogICAgICogVGhpcyBmaXhlcyBhIHByb2JsZW0gd2l0aCByZWFsbHkgdGlueSAic2Nyb2xsIiBidXR0b25zLiBJbiBwYXJ0aWN1bGFyCiAgICAgKiB3aXRoIHRoZSB1cGRvd24gY29udHJvbC4gCiAgICAgKiBNYWtpbmcgc3VyZSB0aGF0IHRoZSBhcnJvdyBpcyBhcyBsZWFzdCAzIHBpeGVscyB3aWRlIChvciBoaWdoKS4KICAgICAqLwogICAgaWYgKHRyaSA9PSAwKQogICAgICB0cmkgPSAxOwoKICAgIHN3aXRjaCh1RmxhZ3MgJiAweGZmKQogICAgewogICAgY2FzZSBERkNTX1NDUk9MTENPTUJPQk9YOgogICAgY2FzZSBERkNTX1NDUk9MTERPV046CiAgICAgICAgTGluZVsyXS54ID0gbXlyLmxlZnQgKyA0NzAqU21hbGxEaWFtLzEwMDAgKyAyOwogICAgICAgIExpbmVbMl0ueSA9IG15ci50b3AgICsgNjg3KlNtYWxsRGlhbS8xMDAwICsgMTsKICAgICAgICBMaW5lWzBdLnggPSBMaW5lWzJdLnggLSB0cmk7CiAgICAgICAgTGluZVsxXS54ID0gTGluZVsyXS54ICsgdHJpOwogICAgICAgIExpbmVbMF0ueSA9IExpbmVbMV0ueSA9IExpbmVbMl0ueSAtIHRyaTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfU0NST0xMVVA6CiAgICAgICAgTGluZVsyXS54ID0gbXlyLmxlZnQgKyA0NzAqU21hbGxEaWFtLzEwMDAgKyAyOwogICAgICAgIExpbmVbMl0ueSA9IG15ci5ib3R0b20gLSAoNjg3KlNtYWxsRGlhbS8xMDAwICsgMSk7CiAgICAgICAgTGluZVswXS54ID0gTGluZVsyXS54IC0gdHJpOwogICAgICAgIExpbmVbMV0ueCA9IExpbmVbMl0ueCArIHRyaTsKICAgICAgICBMaW5lWzBdLnkgPSBMaW5lWzFdLnkgPSBMaW5lWzJdLnkgKyB0cmk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX1NDUk9MTExFRlQ6CiAgICAgICAgTGluZVsyXS54ID0gbXlyLnJpZ2h0IC0gKDY4NypTbWFsbERpYW0vMTAwMCArIDEpOwogICAgICAgIExpbmVbMl0ueSA9IG15ci50b3AgICsgNDcwKlNtYWxsRGlhbS8xMDAwICsgMjsKICAgICAgICBMaW5lWzBdLnkgPSBMaW5lWzJdLnkgLSB0cmk7CiAgICAgICAgTGluZVsxXS55ID0gTGluZVsyXS55ICsgdHJpOwogICAgICAgIExpbmVbMF0ueCA9IExpbmVbMV0ueCA9IExpbmVbMl0ueCArIHRyaTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfU0NST0xMUklHSFQ6CiAgICAgICAgTGluZVsyXS54ID0gbXlyLmxlZnQgKyA2ODcqU21hbGxEaWFtLzEwMDAgKyAxOwogICAgICAgIExpbmVbMl0ueSA9IG15ci50b3AgICsgNDcwKlNtYWxsRGlhbS8xMDAwICsgMjsKICAgICAgICBMaW5lWzBdLnkgPSBMaW5lWzJdLnkgLSB0cmk7CiAgICAgICAgTGluZVsxXS55ID0gTGluZVsyXS55ICsgdHJpOwogICAgICAgIExpbmVbMF0ueCA9IExpbmVbMV0ueCA9IExpbmVbMl0ueCAtIHRyaTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfU0NST0xMU0laRUdSSVA6CiAgICAgICAgLyogVGhpcyBvbmUgYnJlYWtzIHRoZSBmbG93Li4uICovCiAgICAgICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShkYywgciwgRURHRV9CVU1QLCBCRl9NSURETEUgfCAoKHVGbGFncyYoREZDU19NT05PfERGQ1NfRkxBVCkpID8gQkZfTU9OTyA6IDApKTsKICAgICAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfUEVOKSk7CiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfQlJVU0gpKTsKICAgICAgICBpZih1RmxhZ3MgJiAoREZDU19NT05PfERGQ1NfRkxBVCkpCiAgICAgICAgewogICAgICAgICAgICBocCA9IGhwMiA9IEdldFN5c0NvbG9yUGVuKENPTE9SX1dJTkRPV0ZSQU1FKTsKICAgICAgICAgICAgaGIgPSBoYjIgPSBHZXRTeXNDb2xvckJydXNoKENPTE9SX1dJTkRPV0ZSQU1FKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaHAgID0gR2V0U3lzQ29sb3JQZW4oQ09MT1JfQlROSElHSExJR0hUKTsKICAgICAgICAgICAgaHAyID0gR2V0U3lzQ29sb3JQZW4oQ09MT1JfQlROU0hBRE9XKTsKICAgICAgICAgICAgaGIgID0gR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5ISUdITElHSFQpOwogICAgICAgICAgICBoYjIgPSBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTlNIQURPVyk7CiAgICAgICAgfQogICAgICAgIExpbmVbMF0ueCA9IExpbmVbMV0ueCA9IHItPnJpZ2h0LTE7CiAgICAgICAgTGluZVsyXS55ID0gTGluZVszXS55ID0gci0+Ym90dG9tLTE7CiAgICAgICAgZDQ2ID0gNDYqU21hbGxEaWFtLzc1MDsKICAgICAgICBkOTMgPSA5MypTbWFsbERpYW0vNzUwOwoKICAgICAgICBpID0gNTg2KlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZVswXS55ID0gci0+Ym90dG9tIC0gaSAtIDE7CiAgICAgICAgTGluZVszXS54ID0gci0+cmlnaHQgLSBpIC0gMTsKICAgICAgICBMaW5lWzFdLnkgPSBMaW5lWzBdLnkgKyBkNDY7CiAgICAgICAgTGluZVsyXS54ID0gTGluZVszXS54ICsgZDQ2OwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHApOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBMaW5lWzFdLnkrKzsgTGluZVsyXS54Kys7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsxXS55ICsgZDkzOwogICAgICAgIExpbmVbM10ueCA9IExpbmVbMl0ueCArIGQ5MzsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiMik7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocDIpOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBpID0gMzk4KlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZVswXS55ID0gci0+Ym90dG9tIC0gaSAtIDE7CiAgICAgICAgTGluZVszXS54ID0gci0+cmlnaHQgLSBpIC0gMTsKICAgICAgICBMaW5lWzFdLnkgPSBMaW5lWzBdLnkgKyBkNDY7CiAgICAgICAgTGluZVsyXS54ID0gTGluZVszXS54ICsgZDQ2OwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHApOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBMaW5lWzFdLnkrKzsgTGluZVsyXS54Kys7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsxXS55ICsgZDkzOwogICAgICAgIExpbmVbM10ueCA9IExpbmVbMl0ueCArIGQ5MzsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiMik7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocDIpOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBpID0gMjEwKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZVswXS55ID0gci0+Ym90dG9tIC0gaSAtIDE7CiAgICAgICAgTGluZVszXS54ID0gci0+cmlnaHQgLSBpIC0gMTsKICAgICAgICBMaW5lWzFdLnkgPSBMaW5lWzBdLnkgKyBkNDY7CiAgICAgICAgTGluZVsyXS54ID0gTGluZVszXS54ICsgZDQ2OwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHApOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBMaW5lWzFdLnkrKzsgTGluZVsyXS54Kys7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsxXS55ICsgZDkzOwogICAgICAgIExpbmVbM10ueCA9IExpbmVbMl0ueCArIGQ5MzsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiMik7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocDIpOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDQpOwoKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgICAgIHJldHVybiBUUlVFOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgV0FSTigiSW52YWxpZCBzY3JvbGw7IGZsYWdzPTB4JTA0eFxuIiwgdUZsYWdzKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgLyogSGVyZSBkbyB0aGUgcmVhbCBzY3JvbGwtYmFyIGNvbnRyb2xzIGVuZCB1cCAqLwogICAgaWYoICEgKHVGbGFncyAmICgweGZmMDAgJiB+REZDU19BREpVU1RSRUNUKSkgKQogICAgICAvKiBVSVRPT0xTOTVfREZDX0J1dHRvblB1c2ggYWx3YXlzIHVzZXMgQkZfU09GVCB3aGljaCB3ZSBkb24ndCAqLwogICAgICAvKiB3YW50IGZvciB0aGUgbm9ybWFsIHNjcm9sbC1hcnJvdyBidXR0b24uICovCiAgICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoIGRjLCByLCBFREdFX1JBSVNFRCwgKHVGbGFncyZERkNTX0FESlVTVFJFQ1QpIHwgQkZfTUlERExFIHwgQkZfUkVDVCk7CiAgICBlbHNlCiAgICAgIFVJVE9PTFM5NV9ERkNfQnV0dG9uUHVzaChkYywgciwgKHVGbGFncyAmIDB4ZmYwMCkgKTsKCiAgICBpZih1RmxhZ3MgJiBERkNTX0lOQUNUSVZFKQogICAgewogICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgICAgUG9seWdvbihkYywgTGluZSwgMyk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgIH0KCiAgICBpZiggKHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUpIHx8ICEodUZsYWdzICYgREZDU19QVVNIRUQpICkKICAgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICB7CiAgICAgICAgTGluZVtpXS54LS07CiAgICAgICAgTGluZVtpXS55LS07CiAgICAgIH0KCiAgICBpID0gdUZsYWdzICYgREZDU19JTkFDVElWRSA/IENPTE9SX0JUTlNIQURPVyA6IENPTE9SX0JUTlRFWFQ7CiAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChpKSk7CiAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKGkpKTsKICAgIFBvbHlnb24oZGMsIExpbmUsIDMpOwogICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwoKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgVUlUT09MU19EcmF3RnJhbWVNZW51CiAqCiAqIERyYXcgYSBtZW51IGNvbnRyb2wgY29taW5nIGZyb20gRHJhd0ZyYW1lQ29udHJvbCgpCiAqLwpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfRHJhd0ZyYW1lTWVudShIREMgZGMsIExQUkVDVCByLCBVSU5UIHVGbGFncykKewogICAgUE9JTlQgUG9pbnRzWzZdOwogICAgUkVDVCBteXI7CiAgICBpbnQgU21hbGxEaWFtID0gVUlUT09MU19NYWtlU3F1YXJlUmVjdChyLCAmbXlyKTsKICAgIGludCBpOwogICAgSEJSVVNIIGhic2F2ZTsKICAgIEhQRU4gaHBzYXZlOwogICAgaW50IHhlLCB5ZTsKICAgIGludCB4YywgeWM7CiAgICBCT09MIHJldHZhbCA9IFRSVUU7CgogICAgLyogVXNpbmcgYmxhY2sgYW5kIHdoaXRlIHNlZW1zIHRvIGJlIHV0dGVybHkgd3JvbmcsIGJ1dCB3aW45NSBkb2Vzbid0ICovCiAgICAvKiB1c2UgYW55dGhpbmcgZWxzZS4gSSB0aGluayBJIHRyaWVkIGFsbCBzeXMtY29sb3JzIHRvIGNoYW5nZSB0aGluZ3MgKi8KICAgIC8qIHdpdGhvdXQgbHVjay4gSXQgc2VlbXMgYXMgaWYgdGhpcyBiZWhhdmlvciBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgKi8KICAgIC8qIHdpbjMxIERGQygpIGltcGxlbWVudGF0aW9uLi4uICh5b3UgcmVtZW1iZXIsIEIvVyBtZW51cykuICovCgogICAgRmlsbFJlY3QoZGMsIHIsIChIQlJVU0gpR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpKTsKCiAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3RvY2tPYmplY3QoQkxBQ0tfQlJVU0gpKTsKICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3RvY2tPYmplY3QoQkxBQ0tfUEVOKSk7CgogICAgc3dpdGNoKHVGbGFncyAmIDB4ZmYpCiAgICB7CiAgICBjYXNlIERGQ1NfTUVOVUFSUk9XOgogICAgICAgIGkgPSAxODcqU21hbGxEaWFtLzc1MDsKICAgICAgICBQb2ludHNbMl0ueCA9IG15ci5sZWZ0ICsgNDY4KlNtYWxsRGlhbS83NTA7CiAgICAgICAgUG9pbnRzWzJdLnkgPSBteXIudG9wICArIDM1MipTbWFsbERpYW0vNzUwKzE7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBQb2ludHNbMl0ueSAtIGk7CiAgICAgICAgUG9pbnRzWzFdLnkgPSBQb2ludHNbMl0ueSArIGk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBQb2ludHNbMV0ueCA9IFBvaW50c1syXS54IC0gaTsKICAgICAgICBQb2x5Z29uKGRjLCBQb2ludHMsIDMpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREZDU19NRU5VQlVMTEVUOgogICAgICAgIHhlID0gbXlyLmxlZnQ7CiAgICAgICAgeWUgPSBteXIudG9wICArIFNtYWxsRGlhbSAtIFNtYWxsRGlhbS8yOwogICAgICAgIHhjID0gbXlyLmxlZnQgKyBTbWFsbERpYW0gLSBTbWFsbERpYW0vMjsKICAgICAgICB5YyA9IG15ci50b3AgICsgU21hbGxEaWFtIC0gU21hbGxEaWFtLzI7CiAgICAgICAgaSA9IDIzNCpTbWFsbERpYW0vNzUwOwogICAgICAgIGkgPSBpIDwgMSA/IDEgOiBpOwogICAgICAgIG15ci5sZWZ0ICAgPSB4YyAtIGkraS8yOwogICAgICAgIG15ci5yaWdodCAgPSB4YyArIGkvMjsKICAgICAgICBteXIudG9wICAgID0geWMgLSBpK2kvMjsKICAgICAgICBteXIuYm90dG9tID0geWMgKyBpLzI7CiAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCB4ZSwgeWUsIHhlLCB5ZSk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX01FTlVDSEVDSzoKICAgICAgICBQb2ludHNbMF0ueCA9IG15ci5sZWZ0ICsgMjUzKlNtYWxsRGlhbS8xMDAwOwogICAgICAgIFBvaW50c1swXS55ID0gbXlyLnRvcCAgKyA0NDUqU21hbGxEaWFtLzEwMDA7CiAgICAgICAgUG9pbnRzWzFdLnggPSBteXIubGVmdCArIDQwOSpTbWFsbERpYW0vMTAwMDsKICAgICAgICBQb2ludHNbMV0ueSA9IFBvaW50c1swXS55ICsgKFBvaW50c1sxXS54LVBvaW50c1swXS54KTsKICAgICAgICBQb2ludHNbMl0ueCA9IG15ci5sZWZ0ICsgNjkwKlNtYWxsRGlhbS8xMDAwOwogICAgICAgIFBvaW50c1syXS55ID0gUG9pbnRzWzFdLnkgLSAoUG9pbnRzWzJdLngtUG9pbnRzWzFdLngpOwogICAgICAgIFBvaW50c1szXS54ID0gUG9pbnRzWzJdLng7CiAgICAgICAgUG9pbnRzWzNdLnkgPSBQb2ludHNbMl0ueSArIDMqU21hbGxEaWFtLzE2OwogICAgICAgIFBvaW50c1s0XS54ID0gUG9pbnRzWzFdLng7CiAgICAgICAgUG9pbnRzWzRdLnkgPSBQb2ludHNbMV0ueSArIDMqU21hbGxEaWFtLzE2OwogICAgICAgIFBvaW50c1s1XS54ID0gUG9pbnRzWzBdLng7CiAgICAgICAgUG9pbnRzWzVdLnkgPSBQb2ludHNbMF0ueSArIDMqU21hbGxEaWFtLzE2OwogICAgICAgIFBvbHlnb24oZGMsIFBvaW50cywgNik7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBXQVJOKCJJbnZhbGlkIG1lbnU7IGZsYWdzPTB4JTA0eFxuIiwgdUZsYWdzKTsKICAgICAgICByZXR2YWwgPSBGQUxTRTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICByZXR1cm4gcmV0dmFsOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgRHJhd0ZyYW1lQ29udHJvbDE2ICAoVVNFUi42NTYpCiAqLwpCT09MMTYgV0lOQVBJIERyYXdGcmFtZUNvbnRyb2wxNiggSERDMTYgaGRjLCBMUFJFQ1QxNiByYywgVUlOVDE2IHVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHVTdGF0ZSApCnsKICAgIFJFQ1QgcmVjdDMyOwogICAgQk9PTCByZXQ7CgogICAgQ09OVl9SRUNUMTZUTzMyKCByYywgJnJlY3QzMiApOwogICAgcmV0ID0gRHJhd0ZyYW1lQ29udHJvbCggaGRjLCAmcmVjdDMyLCB1VHlwZSwgdVN0YXRlICk7CiAgICBDT05WX1JFQ1QzMlRPMTYoICZyZWN0MzIsIHJjICk7CiAgICByZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgRHJhd0ZyYW1lQ29udHJvbDMyICAoVVNFUjMyLjE1OCkKICovCkJPT0wgV0lOQVBJIERyYXdGcmFtZUNvbnRyb2woIEhEQyBoZGMsIExQUkVDVCByYywgVUlOVCB1VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdVN0YXRlICkKewogICAgLyogV2luOTUgZG9lc24ndCBzdXBwb3J0IGRyYXdpbmcgaW4gb3RoZXIgbWFwcGluZyBtb2RlcyAqLwogICAgaWYoR2V0TWFwTW9kZShoZGMpICE9IE1NX1RFWFQpCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIAogICAgc3dpdGNoKHVUeXBlKQogICAgewogICAgY2FzZSBERkNfQlVUVE9OOgogICAgICByZXR1cm4gVUlUT09MUzk1X0RyYXdGcmFtZUJ1dHRvbihoZGMsIHJjLCB1U3RhdGUpOwogICAgY2FzZSBERkNfQ0FQVElPTjoKICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RnJhbWVDYXB0aW9uKGhkYywgcmMsIHVTdGF0ZSk7CiAgICBjYXNlIERGQ19NRU5VOgogICAgICByZXR1cm4gVUlUT09MUzk1X0RyYXdGcmFtZU1lbnUoaGRjLCByYywgdVN0YXRlKTsKICAgIGNhc2UgREZDX1NDUk9MTDoKICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RnJhbWVTY3JvbGwoaGRjLCByYywgdVN0YXRlKTsKICAgIGRlZmF1bHQ6CiAgICAgIFdBUk4oIigleCwlcCwlZCwleCksIGJhZCB0eXBlIVxuIiwKCSAgIGhkYyxyYyx1VHlwZSx1U3RhdGUgKTsKICAgIH0KICAgIHJldHVybiBGQUxTRTsKfQoK